在32位WinXP下使用64位数字

时间:2013-11-09 17:34:17

标签: c windows assembly x86 nasm

我是汇编的新手,我想知道为什么添加两个64位整数的函数无法正确计算:

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 32bit下使用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

1 个答案:

答案 0 :(得分:3)

汇编功能对我来说很好看。我强烈怀疑%Ld说明符是错误的。 -1863462912是200000000000的低32位。

尝试%lld