Assembler- dodawanie liczb. Kłopot gdy suma jest dwucyfrowa.

0

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
0

To proste. Nie rozumiesz co robisz. To jest tablica znaków ascii:
http://www.bindichen.co.uk/uploads/ascii%20code.jpg
Każdy taki znak ma swój numer. Rozumiesz w ogóle co zrobiłeś tutaj:

        sub     ecx, 48

? Bo mam wątpliwości. Napisz mi proszę co wg ciebie oznacza ta linijka i skad się wzięła.

0

Przyznam się, że dokładnie tego nie rozumiem ale z tego co się dowiedziałem to zamienia znak na liczbę.

1

No to skąd ukradłeś ten kod? Bo przecież go sam nie napisałeś skoro nie rozumiesz co robi. Nie da się tak programować...
Teoretycznie odjęcie 48 (czyli odjęcie znaku '0') zamienia znak na liczbę (tzn np. zamieni ci znak '5' na liczbę 5 bo znak '5' ma numer 53), ale nie w twoim kodzie. Bo widzisz ty w swoim kodzie dodałeś dwa znaki (!). Więc jak ktoś podał na wejściu 4 oraz 4 to ty zsumowałeś ich numery czyli zrobiłeś 52+52 = 104 a potem dopiero odjąłeś 48, co w efekcie dało 104-48 = 56 czyli znak 8.

Ale wracając do twojego problemu: zobacz co sie stanie jak podam na wejściu 5 oraz 6 -> nastąpi sumowanie 53+54 = 107. Potem odejmujesz 48 i w efekcie mamy 107-48 = 59. A zgodnie z tablicą ascii znak o numerze 59 to ; więc kod działa zupełnie poprawnie. Żeby kod zadziałał tak jak byś tego chciał to musisz to zrobić w ZNACZNIE bardziej skomplikowany sposób. Po pierwsze musisz sumować liczby a nie numery ich znaku. Po drugie jak juz masz sumę to musisz ją zamieniać na znaki cyfra po cyfrze, tzn dzieląc przez 10 i wyciągając reszty z dzielenia przez 10, żeby podzielić liczbę na poszczególne cyfry, a potem do tak wyciągnietych cyfr dodawać '0' i wypisywać znak po znaku.
Dodatkowo pewnie tego nie zauważyłeś ale twój kod pozwala użytownikowi na podawanie liczb jednocyfrowych. To też należało zrobić po ludzku, tzn czytać wszystkie znaki podane przez użytkownika, każdy znak zamieniać na liczbę a potem złożyć z nich całą liczbę za pomocą mnożenia przez 10 i dodawania.

0

możesz nie wierzyć ale kod jest mój :) Nie rozumiem jeszcze assemblera za dobrze, a ten kod pisałem sugerując się na moich notatkach z lekcji, których dokładnie nie rozumiałem. Bardzo dziękuję za Twoją pomoc. Teraz będę wiedział jak się za to wziąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1