如何在32位机器上添加几个32位数但没有精度损失,即在64位“伪寄存器”eax:edx
中。使用Intel语法汇编程序。
答案 0 :(得分:3)
假设你要添加的32位数字是在EAX和EBX中:
xor edx,edx ;Set EDX to zero
add eax,ebx
adc edx,0 ;edx:eax = EAX + EBX
答案 1 :(得分:0)
如果我正确理解了这个问题,你有两个32位整数可能会给出一个64位整数。你希望在没有32位溢出的情况下这样做。
如何看待编译器的作用:
$ cat add64.c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main (int argc, char **argv) {
uint32_t a, b;
a = strtoll(argv[1], NULL, 10);
b = strtoll(argv[2], NULL, 10);
printf("%lu + %lu = %llu\n", a, b, (uint64_t) a + b);
return 0;
}
$ gcc -m32 -g -o add64 add64.c
$ ./add64 3000000000 4000000000
3000000000 + 4000000000 = 7000000000
$ gcc -m32 -g -fverbose-asm -masm=intel -S add64.c
$ $EDITOR add64.s &
[5] 340
$
相关的生成程序集是:
mov %ecx, DWORD PTR [%ebp-16] # D.2300, a
mov %ebx, 0 # D.2300,
mov %eax, DWORD PTR [%ebp-12] # D.2301, b
mov %edx, 0 # D.2301,
add %eax, %ecx # D.2302, D.2300
adc %edx, %ebx # D.2302, D.2300
答案 2 :(得分:0)
为了在32位机器上添加64位数字,您必须先将64位数字的上半部分移动到寄存器eax中,然后将后半部分移动到edx中。操作此数字时,您必须跟踪数字在eax / edx中的放置方式。