0

私はアセンブリが初めてで、2 つの 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 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か?

4

1 に答える 1

3

アセンブリ機能は私には問題ないようです。%Ld指定子が間違っていると強く思います。-1863462912 は 200000000000 の下位 32 ビットです。

試してみてください%lld

于 2013-11-09T19:21:30.110 に答える