在32台机器上的64位上下文中添加32位数字

时间:2013-11-12 22:35:35

标签: assembly x86 nasm intel

如何在32位机器上添加几个32位数但没有精度损失,即在64位“伪寄存器”eax:edx中。使用Intel语法汇编程序。

3 个答案:

答案 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中的放置方式。