Assembler dodawanie liczb- problem z suma dwucyfrowa


(Dawcza57) #1

Witam, uczę się assemblera i zajmuje się aktualnie działaniami arytmetycznymi. Mam program na sume 2 liczb wprowadzanych z klawiatury. Program działa ale tylko jeśli wynik jest liczba jednocyfrową, jeśli suma wynosi 10 wyświetla : jeśli 11 wyświetla ; . Nie mam pojęcia co źle zrobiłem. Oto kod:

 

section .tekst
global _start
 
_start:
 
        mov     eax, 4
        mov     ebx, 1
        mov     ecx, tekst
        mov     edx, [dlugosc]
        int     80h
 
        mov     eax, 3
        mov     ebx, 0
        mov     ecx, x
        mov     edx, [dlgx]
        int     80h
 
        mov     eax, 4
        mov     ebx, 1
        mov     ecx, tekst2
        mov     edx, [dlg2]
        int     80h
 
        mov     eax, 3
        mov     ebx, 0
        mov     ecx, y
        mov     edx, [dlgy]
        int     80h
 
        mov     eax, 4
        mov     ebx, 1
        mov     ecx, tekst3
        mov     edx, [dlg3]
        int     80h
 
        mov     ecx, [x]
        add     ecx, [y]
        sub     ecx, 48
        mov     [wynik], ecx
        mov     edx, [dlgw]
 
        mov     eax, 4
        mov     ebx, 1
        mov     ecx, wynik
        mov     edx, [dlgw]
        int     80h
 
        mov     eax, 1
        int     80h
 
section .data
 
        tekst   db      "Program obliczajacy sume dwoch liczb", 0ah, "Podaj pierwsza liczbe:", 0ah
        dlugosc dd      $-tekst
        x       dd      0
        dlgx    dd      $-x
        tekst2  db      "Podaj druga liczbe:", 0ah
        dlg2    dd      $-tekst2
        y       dd      0
        dlgy    dd      $-y
        tekst3  db      "Suma podanych liczb wynosi:", 0ah
        dlg3    dd      $-tekst3
        wynik   dd      0
        dlgw    dd      $-wynik

(Pablo_Wawa) #2

Nie dziwota, że Ci wyświetla takie znaki, jak w kodzie masz zaimplementowanie dodawanie “jednocyfrowe”:

mov ecx, [x]
        add ecx, [y]
        sub ecx, 48
        mov [wynik], ecx
        mov edx, [dlgw]

Otóż jak Ci wyjdzie liczba >=10 (+48 jako że jest obliczana z char’a), to trzeba ją odpowiednio przekonwertować, tj. “wyłuskać” drugą cyfrę takiej liczby i wstawić jako 2 bajt liczby [pod adresem wynik+1]. No i wtedy trzeba też pamiętać, żeby przy wypisywaniu wyniku podać odpowiednią długość (edx=2) - nie wiem, czemu zawsze podajesz długość 4 (znaki o kodzie 0 są pewne nie wyświetlane)?

 

P.S. Pamiętaj, że wypisywanie działa na tekstach (stringach), więc wynik = 12 (jako liczba/wartość) jest zapisany w pamięci jako 12,0,0,0 (4 bajty), a do wyświetlenia musi być zapisany 1+48,2+48,0,0 (te +48 to taka konwersja liczby do ASCII).


(Johny) #3

Trzeba dodawać kod znaku “0” do każdego bajtu,wtedy jest konwersja na ASCII