2013-06-24 24 views
0

我試圖添加兩個兩位數的數字,這些數字必然會產生一個兩位數或三位數的數字。程序集中的Div

這裏是我到目前爲止,當我嘗試打印進位,它說:浮點異常(核心轉儲)

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

這是什麼操作系統? Linux呢? –

+0

是的,我忘了提到抱歉。 32bit Linux –

+0

什麼行產生異常?引發異常的指令的參數是什麼?請注意,某些指令有隱含參數。 –

回答

0

注意把握「浮動點例外「,但這些行很可能導致分區溢出:

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

您我們將從numb2轉換爲ax,這意味着您將獲得中ah存儲的任何內容。如果我們假設.bss部分在啓動時歸零,則當您將它加載到ah時,因爲您已完成sub byte[carry], 30h,因此carry的值將爲0xD0

因此,您將0xD0nn除以10,這將導致商數太大而不適合al。您可以用movzx ax,byte [numb2]代替mov ax, [numb2]

+0

當然,'子字節[carry],30h'本身是有問題的,應該是'mov byte [carry],0'而不是...依靠'carry'來初始化爲零通常是可以的,除非不是這樣,否則會導致頭髮被拉扯,牙齒變得粗糙。 – twalberg

0

首先,xor ebx, ebx將更短和快於mov ebx, 0

此外,加入2 1位數字的結果的1(9 + 9 = 18)的最大進位,所以沒必要來劃分,只減去10號是足夠

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

會比下面

mov ax, [numb2] 
sub ax, 10 

但畢竟,爲什麼做這樣的「複雜」,而86 ALRE方式要慢得多ady有DAA and instructions for many other BCD maths。此外,這些說明還有AF和CF,因此無需自行管理。您也可以直接使用二進制數學算法,只需在輸入/輸出處將其轉換。大多數情況下,轉換成本可以忽略不計