(ASSEMBLER) Odejmowanie

Dane Segment
liczba1 db 0
liczba2 db 0
ekran dw 0
txt_info          db ”       ************ Program odejmuje liczbe2 od liczby1  ************$”
txt_menuA         db “[l]:Wpis Danej1     [p]:Wpis Danej2     [w]:Wypisz wynik   [Esc]:Wyjscie $”
txt_menuB         db ”          [b]:Potwierdz       [BackSpace]:Korekta       [Esc]:Anuluj          $”
txt_linia         db ”        ————————————————————–        $”


txt_nawL          db ”  [$”
txt_nawP          db “]$”
txt_liczba1       db ”   Liczba pierwsza : $”
txt_liczba2       db ”   Liczba druga    : $”
txt_podaj_liczbe1 db “Podaj pierwsza liczbe : $”
txt_podaj_liczbe2 db “Podaj druga liczbe : $”
txt_wynik         db ”   Wynik :                                         $”
txt_wyjscie       db “Wyjscie … DZiekujemy za skorzystanie z programu$”

ustawienie dw 0B06h

Dane Ends

Stos Segment Stack
db 100 dup(?)
Stos Ends

Program Segment
Assume Ds:Dane,Ss:Stos,Cs:Program

Start:
mov     ax,Dane
mov     ds,ax
mov     ax,Stos
mov     ss,ax
call    wyswietl_menu
call    wyswietl_dana1
call    wyswietl_dana2
call    wyswietl_wynik
looop:
call    pobierz_znak
cmp     al,27
jz      wyjscie
cmp     al,’l’
jnz     ustawienie_danej1
call    nowa_dana1
jmp     looop
ustawienie_danej1:
cmp     al,’p’
jnz     ustawienie_danej2
call    nowa_dana2
jmp     looop
ustawienie_danej2:
cmp     al,’w’
jnz     looop
call    wyswietl_wynik
jmp     looop
wyjscie:
mov     dx,offset txt_wyjscie
mov     bx,1316h
call    konwersja_wspolrz
call    pobierz_znak
call    czyszczenie
mov     ah,04ch
int     21h

wyswietl_menu PROC

call    czyszczenie
mov     dx,offset txt_menuA
mov     bx,0103h
call    konwersja_wspolrz
mov     dx,offset txt_info
mov     bx,0101h
call    konwersja_wspolrz
mov     dx,offset txt_linia
mov     bx,0104h
call    konwersja_wspolrz
mov     dx,offset txt_liczba1
mov     bx,0606h
call    konwersja_wspolrz
mov     dx,offset txt_liczba2
mov     bx,0608h
call    konwersja_wspolrz
mov     dx,offset txt_wynik
mov     bx,060Eh
call    konwersja_wspolrz
ret
wyswietl_menu ENDP

wyswietl_dana1 PROC
mov     dx,0619h
call    kursor
mov     al,liczba1
call    wypisz_oct_u2
ret
wyswietl_dana1 ENDP

wyswietl_dana2 PROC
mov     dx,0819h
call    kursor
mov     al,liczba2
call    wypisz_oct_u2
ret
wyswietl_dana2 ENDP

wyswietl_wynik PROC
mov     dx,0E1Bh
call    kursor
mov     al,liczba1
mov     ah,liczba2
sub     al,ah
call    wypisz_wynik_oct_u2
ret
wyswietl_wynik ENDP

nowa_dana1 PROC
mov     dx,0627h
mov     ekran,dx
call    kursor
call    czytU2
cmp     ah,0
jz      menu_nowa_dana1
mov     liczba1,al
call    wyczysc_wynik

menu_nowa_dana1:
mov     dx,offset txt_menuA
mov     bx,0103h
call    konwersja_wspolrz
call    wyswietl_dana1
call    pozycja
ret
nowa_dana1 ENDP

nowa_dana2 PROC
mov     dx,0827h
mov     ekran,dx
call    kursor
call    czytU2
cmp     ah,0
jz      menu_nowa_dana2
mov     liczba2,al
call    wyczysc_wynik

menu_nowa_dana2:
mov     dx,offset txt_menuA
mov     bx,0103h
call    konwersja_wspolrz
call    wyswietl_dana2
call    pozycja
ret
nowa_dana2 ENDP

wypisz PROC
mov     ah,9
int     21h
ret
wypisz ENDP

konwersja_wspolrz PROC
push    dx
mov     dl,bh
mov     dh,bl
call    kursor
pop     dx
call    wypisz
ret
konwersja_wspolrz ENDP

wypisz_znak PROC
mov     ah,2
int     21h
ret
wypisz_znak ENDP

pobierz_znak PROC
mov     ah,8
int     21h
ret
pobierz_znak ENDP

kursor PROC                           ; DL = x  DH = y
mov     ah,2
mov     bh,0
int     10h
ret
kursor ENDP

czysc PROC
call    kursor
mov     dl,’ ‘
mov     ch,0
czysc_loop:
call    wypisz_znak
loop    czysc_loop
ret
czysc ENDP

czyszczenie PROC
mov     ax,3
int     10h
ret
czyszczenie ENDP

czytU2 PROC
mov     ch,0       ;liczba wczytanych znakow
mov     ah,1       ;kod wyniku
mov     bl,0       ;liczba w u2

pobierz_kolejny_znak:
call    pobierz_znak
cmp    al,0
jnz     nic
jmp    pobierz_kolejny_znak
nic:
cmp     al,27            ;ESC
jz      anuluj
cmp     al,’b’
jz      ok
cmp     al,’B’
jz      ok
cmp     al,8            ;BackSpace
jz      backspace
sub     al,30h
jz      wpisz_cyfre
cmp     al,1
jz      wpisz_cyfre
jmp     pobierz_kolejny_znak

wpisz_cyfre:
mov     dl,al
shl     bl,1
or      bl,al
inc     ch
cmp     ch,8
je      ok

zamotej_sie:
push    ax
push    bx
push    cx
push    dx
mov     al,bl
mov     dx,ekran
sub     dl,7h
call    kursor
call    wypisz_u2
pop     dx
pop     cx
pop     bx
pop     ax
push    ax
push    bx
push    dx
mov     dx,ekran
sub     dl,0Eh
call    kursor
mov     al,bl
call    wypisz_oct_b_zeznakiem
mov     dx,ekran
call    kursor
pop     dx
pop     bx
pop     ax
jmp     pobierz_kolejny_znak

backspace:
cmp     ch,0
jle     pobierz_kolejny_znak
cmp     ch,8
jge     pobierz_kolejny_znak
shr     bl,1
dec     ch
jmp     zamotej_sie

anuluj:
mov     ah,0
ok:
mov     al,bl
ret
czytU2 ENDP

;———–wypisywanie liczb wproswadzonych do komputera—————-

wypisz_wynik_oct_u2 PROC
push    ax
call    wypisz_oct_b_zeznakiem
mov     dx,offset txt_nawL
call    wypisz
pop     ax
call    wypisz_u2
mov     dx,offset txt_nawP
call    wypisz
ret
wypisz_wynik_oct_u2 ENDP

wypisz_u2 PROC
mov     cx,8
mov     dh,al
petla:
mov     al,dh
mov     bh,30h      ;znkak 0
mov     ah,1
mov     bl,cl
dec     bl
push    cx
mov     cl,bl
shl     ah,cl
pop     cx
and     al,ah
jz      zero
inc     bh
zero:
mov     dl,bh
call    wypisz_znak
loop    petla
ret
wypisz_u2 ENDP

wypisz_oct_b_zeznakiem PROC
mov     bl,’+’
mov     dh,al      ;dh – liczba
mov     ah,80h     ;maska 10000000
and     al,ah
jz      dodatnia
dec     dh
not     dh
mov     bl,’-‘
dodatnia:
mov     dl,bl
call    wypisz_znak
mov     al,dh
call    wypisz_oct_b
ret
wypisz_oct_b_zeznakiem ENDP

wypisz_oct_b PROC
mov     dh,al
mov     ah,0C0h    ;11000000
and     al,ah
mov     cl,6       ;przesuniecie o 6 miejsc
shr     al,cl
add     al,30h
mov     dl,al
call    wypisz_znak
mov     al,dh
mov     ah,38h    ;maska 00111000
and     al,ah
mov     cl,3       ;przesuniecie o 3 miejsca
shr     al,cl
add     al,30h
mov     dl,al
call    wypisz_znak
mov     al,dh
mov     ah,7       ;maska 00000111
and     al,ah
add     al,30h
mov     dl,al
call    wypisz_znak
ret
wypisz_oct_b ENDP

wypisz_oct_u2 PROC
push    ax
call    wypisz_oct_b_zeznakiem
mov     dx,offset txt_nawL
call    wypisz
pop     ax
call    wypisz_u2
mov     dx,offset txt_nawP
call    wypisz
ret
wypisz_oct_u2 ENDP

wyczysc_wynik PROC
mov     dx,0C1Ah
mov     cl,30
call    czysc
ret
wyczysc_wynik ENDP

pozycja PROC
mov     dx,ustawienie
mov     cl,40
call    czysc
mov     dx,ustawienie
call    kursor
ret
pozycja ENDP

Program Ends
End Start

odejmowanie