我使用的Visual Studio編譯的代碼,在gcc編譯時如何在C++的彙編代碼中使用C變量?
double callVariadicDoubleFunc(double * doubles, unsigned int numDoubles,double(*TestFunc)(double,...))
{
// sizeof(double) must be 8!
if (numDoubles == 0)
return 0;
double * lastDouble = doubles + (numDoubles - 1);
double res;
int temp;
__asm mov eax, numDoubles
__asm mov edx, lastDouble
__asm mov temp,esp
__asm label_loop:
__asm sub esp, 8
__asm fld qword ptr [edx]
__asm fstp qword ptr [esp]
__asm sub eax, 1
__asm sub edx, 8
__asm test eax, eax
__asm jnz label_loop
__asm call TestFunc
__asm fstp qword ptr res;
__asm mov esp, temp
return res;
}
,但現在我想用gcc但也有一些錯誤,我不能解析它來編譯!刪除所有編譯時錯誤,我已經改變了代碼一點這種形狀:
double evaluationHelper(double* arguments, unsigned numDoubles, double(*mFunction)(...))
{
int temp;
double res;
arguments += numDoubles;
asm("mov eax, numDoubles" "\n"
"mov ecx, arguments" "\n"
"mov temp,esp" "\n"
"label_loop:" "\n"
"sub esp, 8" "\n"
"fld qword ptr [ecx]" "\n"
"fstp qword ptr [esp]" "\n"
"sub eax, 1" "\n"
"sub ecx, 8" "\n"
"test eax, eax" "\n"
"jnz label_loop" "\n"
"call mFunction" "\n"
"fstp qword ptr res" "\n"
"mov esp, temp" );
return res;
}
,但現在我得到鏈接錯誤:
undefined reference to `numDoubles'
undefined reference to `arguments'
undefined reference to `temp'
任何想法我怎麼能解決這些問題?
旁註:我編譯我的代碼與這些選項:「 - 摹-masm =英特爾-O0 -Wall」
我第一次粘貼你的代碼我得到一個分段錯誤,大量的時間花費上調試後,我發現了這個問題!一切順利前'呼叫ebx'但當EBX被稱爲是得到炒的寄存器。所以我不得不將我的內聯asm函數分爲兩部分,一部分初始化並調用函數,第二部分收集結果。 – Ali1S232 2011-12-28 10:25:30
嗯,棘手...... x86 ABI表示EAX,ECX和EDX不是通過函數調用保留的,而是EBX是。所以,解決辦法是隻塗用EBX舉行'&res'指針。你不能把它保存在棧中,因爲你的演奏它。請看看我的答案更新它解決了。 – rodrigo 2011-12-28 11:00:44