2013-04-26 3 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 어셈블리를 작성하고 배열에 숫자를 저장합니다. 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

흠 .. reult_lo은 -589934592이고 result_hi는 1입니다. 인쇄 할 때 4mln 대신 -294967296 인 a1이 있습니다. 음 .. 이건 말이 안돼. 그것은 eax/long/32b에 맞아야합니다. 연결시 오류가 없습니다. –

+0

뭔가를 추가하려면 숫자를 낮추면 효과가 있습니다. –

+0

좋아, 이제 알았어. 오래 서명 했어. 젠장, 그 때 문제가있다. –

관련 문제