2013-04-26 2 views
0

Мне нужна помощь с добавлением двух больших чисел (по большому, я имею в виду, что не вписываются в eax, например). Я знаю, что мне нужно использовать adc, но это не дает мне хороших результатов.Добавление двух больших чисел в сборке x86

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.

+0

Если они не подходят в EAX, они не будут вписываться в 32-разрядный '.long'. В каком формате вы пытаетесь получить результат? –

+0

a1 и a2 подходят в расширенном регистре, выход - нет. Я знаю, что добавление двух чисел в размер слова должно быть сделано каким-то образом. Я просто не знаю, как это сделать. –

+1

Напишите сборку marco (используя struct) для больших чисел и сохраните цифры в массиве: D –

ответ

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 бит вам потребуется переполнение из последнего добавления для переноса.

+0

Hmm .. reult_lo is -589934592, а result_hi - 1. Я отметил, что a1, когда print -294967296 вместо 4mln. Ммм .. это не имеет смысла. Он должен вписываться в eax/long/32b. и при связывании не возникает ошибок. –

+0

Чтобы добавить что-то, если я делаю число ниже, оно работает. –

+0

Хорошо, я получил его сейчас, он подписан долго ... черт, это проблема. –