0
我是新來組裝,我不知道爲什麼這個功能增加了兩個64位整數不正確計算:下32位與64位的數字工作的WinXP
add.asm
bits 32
section .text
global _add64
_add64: ; adding a and b
enter 0,0
mov eax,[ebp+8] ; la
mov edx,[ebp+12] ; ha
add eax,[ebp+16] ; la+= lb
adc edx,[ebp+20] ; ha+= hb with cf
leave
ret
我用下的WinXP 32位NASM編譯器,編譯爲
nasm -f win32 add.asm
用C程序一起使用
add64.c
#include <stdio.h>
long long add64(long long a, long long b);
void main() {
printf("%Ld",add64(100000000000LL,100000000000LL));
}
下的gcc編譯在一起
gcc add64.obj add64.c -o add64.exe
結果是-1863462912
怎麼這麼和怎樣做才能得到預期200000000000
?
用C語言編譯一個等價的函數,並在調試器中看到它是如何工作的。你的GCC調用約定的實現可能是關閉的;一方面,我懷疑EAX:EDX是如何返回64位返回值的。 –