2013-06-24 2 views
0

2 자리 또는 3 자리 숫자를 산출 할 2 자리 숫자 2 개를 추가하려고합니다. 여기 조립 부

내가 지금까지 가지고 있고, 내가 캐리를 인쇄하려고하면, 그것은 "부동에 대한 (코어 덤프) 부동 소수점 예외

section .data 
    msg db "Enter 2 numbers: " 
    msgLen equ $-msg 

section .bss 
    numa1 resb 1 
    numa2 resb 1 
    numb1 resb 1 
    numb2 resb 1 
    carry resb 1 

section .text 
    global _start 

_start: 
    ;print message 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, msg 
    mov edx, msgLen 
    int 80h 

    ;accept first number (1st digit) 
    mov eax, 3 
    mov ebx, 0 
    mov ecx, numa1 
    mov edx, 1 
    int 80h 

    ;accept first number (2nd digit) 
    mov eax, 3 
    mov ebx, 0 
    mov ecx, numa2 
    mov edx, 2 
    int 80h 

    ;accept second number (1st digit) 
    mov eax, 3 
    mov ebx, 0 
    mov ecx, numb1 
    mov edx, 1 
    int 80h 

    ;accept second number (2nd digit) 
    mov eax, 3 
    mov ebx, 0 
    mov ecx, numb2 
    mov edx, 2 
    int 80h 

    ;character to number conversion 
    sub byte[numa1], 30h 
    sub byte[numa2], 30h 
    sub byte[numb1], 30h 
    sub byte[numb2], 30h 
    sub byte[carry], 30h 

    ;;;;;;;;;;;;;;;;;;;;;;;;;; 

    ;add ones digit 
    mov al, [numa2] 
    add byte[numb2], al 
    add byte[numb2], 30h 

    ;get carry of sum of ones digit 
    mov ax, [numb2] 
    mov byte[carry], 10 
    div byte[carry] 

    mov eax, 4 
    mov ebx, 1 
    mov ecx, carry 
    mov edx, 1 
    int 80h 


    mov eax, 1 
    mov ebx, 0 
    int 80h 

carry 
    numa1 numa2 
+ numb2 numb2 
--------------- 
      numb2 

where numb2 = numb2 % 10 
     carry = numb2/10 
+0

어떤 OS입니까? 리눅스? –

+0

예, 미안하다고 언급하는 것을 잊었습니다. 32bit Linux –

+0

예외를 생성하는 행은 무엇입니까? 예외를 발생시킨 명령의 매개 변수는 무엇입니까? 일부 지침에는 암시 적 매개 변수가 있음에 유의하십시오. –

답변

0

참고 있는지 말씀입니다 포인트 예외 (Point Exception) "로 표시되지만 이러한 라인은 나눗셈 오버플로를 일으킬 수 있습니다.

mov ax, [numb2] 
mov byte[carry], 10 
div byte[carry] 

numb2에서 으로 단어 이동을하면 carry에 저장된 내용을 ah에 넣을 수 있습니다. 시작시 .bss 섹션이 0으로 가정 된 경우 sub byte[carry], 30h을 수행 했으므로 의 값은 ah에로드하면 0xD0의 값이됩니다.

따라서 0xD0nn을 10으로 나누면 지수가 너무 커서 al에 맞지 않게됩니다.

mov ax, [numb2]movzx ax,byte [numb2]으로 바꿀 수 있습니다.

+0

물론,'sub byte [carry], 30h'는 그 자체로는 의문의 여지가 있습니다. 아마도'mov byte [carry], 0'이되어야합니다 ... 'carry'를 0으로 초기화하면 보통 괜찮습니다. 그렇지 않은 경우를 제외하고는, 머리카락이 뽑히고 치아가 gnashed 결과와 함께 ... – twalberg

0

우선, xor ebx, ebx 단지 감산 때문에 필요 분할 없음, 1 (9 + 9 = 18)의 최대 올림에서 2 개의 1 자리 숫자 결과를 추가 짧고 또한보다 빠르게 mov ebx, 0

것 (10)에 의해 번호가 충분하다

mov ax, [numb2] 
mov byte[carry], 10 
div byte[carry] 

86 alre을하는 동안 다음과 같은

mov ax, [numb2] 
sub ax, 10 

그러나 결국

, 왜 같은 "복잡한"방법보다 훨씬 느립니다 ady는 DAA and instructions for many other BCD maths입니다. 게다가, 그 지침은 휴대하기 위해 AF와 CF를 가지고 있으므로 직접 관리 할 필요가 없습니다. 또한 이진 수학을 직접 사용하고 입/출력으로 변환 할 수도 있습니다. 대부분의 경우 변환 비용은 무시할 수 있습니다.