在x86程序集中添加两个大数字

时间:2013-04-26 16:21:20

标签: assembly x86 add biginteger

我需要帮助添加两个大数字(大的意思是我不适合eax)。我知道我必须使用adc,但它不会给我带来好结果。

SYSCALL = 0X80
STDIN = 0
STDOUT = 1
SYSREAD = 3
SYSWRITE = 4
SYSEXIT = 1

.section .data

a1: .long 4000000000
a2: .long 4000000000
equals: .long 0

.section .text
.globl _start

_start:

xor %edx, %edx

movl a1, %eax
movl a2, %ebx
adc a2, %eax
movl %eax, equals

mov $SYSEXIT, %eax
int $SYSCALL

我在gdb下用print equals检查结果。

1 个答案:

答案 0 :(得分:0)

不是最时尚的汇编程序,但这样的东西应该可以工作;

a1: .long 4000000000
a2: .long 4000000000
result_lo: .long 0
result_hi: .long 0

movl a1, %eax                ; load a1 into %eax
addl a2, %eax                ; add a2 to %eax
movl %eax, result_lo         ; store low 32 bits of result

movl $0, %eax                ; clear %eax
adcl $0, %eax                ; add carry + 0 to %eax
movl %eax, result_hi         ; store high 32 bits of result

ADC添加两个操作数+上一次操作的进位。不需要将它用于低32位,但对于第二个32位,您将希望上次添加的溢出继续进行。