我有一段C++代碼(在GNU/Linux環境下用g ++編譯)加載函數指針(它的作用如何並不重要),並將一些參數推入堆棧一些內聯彙編,然後調用該函數,代碼如下:32位到64位內聯彙編移植
unsigned long stack[] = { 1, 23, 33, 43 };
/* save all the registers and the stack pointer */
unsigned long esp;
asm __volatile__ ("pusha");
asm __volatile__ ("mov %%esp, %0" :"=m" (esp));
for(i = 0; i < sizeof(stack); i++){
unsigned long val = stack[i];
asm __volatile__ ("push %0" :: "m"(val));
}
unsigned long ret = function_pointer();
/* restore registers and stack pointer */
asm __volatile__ ("mov %0, %%esp" :: "m" (esp));
asm __volatile__ ("popa");
我想補充某種
#ifdef _LP64
// 64bit inline assembly
#else
// 32bit version as above example
#endif
但我不知道64位的機器,任何人都內嵌彙編可以幫助我嗎?
感謝
Simone,我相信你正在尋找應用程序二進制接口ABI。 – 2010-03-25 22:27:39
您是否可以首先了解爲什麼使用內聯彙編調用函數的原因? 當您移動堆棧指針時,用C代碼混合程序塊會很危險。我很高興ret的價值能夠倖免於難。 – nategoose 2010-03-26 18:47:18