2016-02-07 61 views
-2

我寫了一個MASM程序並將其動態加載到我的C++應用程序中。 我一直在for循環中調用它,但是在某個點它只是改變循環的迭代器,並且一切都崩潰了。用於循環的Masm DLL程序

循環代碼:

for (int i = 0; i < 64; i++){ 
    if (useAsm){ 
     if (0 <= i && i <= 15){//F 
      F = FFunc(res[1],res[2],res[3]); 
      g = i; 
     } 
     else if (16 <= i && i <= 31){//G 
      F = GFunc(res[1], res[2], res[3]); 
      g = ((5 * i + 1) & 0x0F); 
     } 
     else if (32 <= i & i <= 47){//H 
      F = HFunc(res[1], res[2], res[3]); 
      g = ((3 * i + 5) & 0x0F); 
     } 
     else if (48 <= i & i <= 63){//I 
      F = IFunc(res[1], res[2], res[3]); 
      g = ((7 * i) & 0x0F); 
     } 
    } 
} 

我在F = GFunc(res[1], res[2], res[3]);得到改變,當我是24

這是MASM程序代碼

GFunc proc Bval: DWORD, 
     Cval: DWORD, 
     Dval: DWORD 
mov eax, Cval 
xor eax, Bval 
and eax, Dval 
xor eax, Cval 
ret 

FFunc工作得很好,所以我不要」我真的明白爲什麼會發生這種情況。

我查了拆解:

call  dword ptr [GFunc] 
add   esp,0Ch 

add esp,0Ch似乎以某種方式覆蓋我,至少這就是調試器告訴我。

回答

1

它看起來像C++編譯器認爲您的彙編函數遵循cdecl calling convention,但您的彙編函數很可能遵循stdcall約定。

固定這將是的GFunc聲明更改爲類似的一種方式:

extern DWORD __stdcall GFunc(DWORD, DWORD, DWORD); 
+0

謝謝!我沒有想到這一點 – Holger