2013-11-09 51 views
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

+0

用C語言編譯一個等價的函數,並在調試器中看到它是如何工作的。你的GCC調用約定的實現可能是關閉的;一方面,我懷疑EAX:EDX是如何返回64位返回值的。 –

回答

3

彙編函數對我來說確實很好。我強烈懷疑%Ld說明符是錯誤的。 -1863462912是200000000000的低32位。

嘗試%lld

+0

是的,你碰到了釘子! –