(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