liczenie segment
assume cs:liczenie,ss:liczenie
org 100h ; 256B stos gdy ss=prog... poza tym... mozliwy com, zamiast exe
; dane
liczba dw 0 ; tu bedzie wynik
mnoznik dw 10 ; podstawa=mnoznik mul zapewnia 32bit wynik (odp. potraktowany)
start:
xor cl,cl ; flage pierwszego znaku sobie zrobimy, bedzie potrzebna;
@wczytaj:
mov ah,01h
int 21h
xor ah,ah ; trza wyzerowac, bo sie wynik powali
cmp al,96
jna @niemale
sub al,32 ; upper case
@niemale:
and cl,1
jnz @licz ; tylko dla pierwszego znaku nie wykona
mov cl,1 ; zmiana podstawy tylko w pierwszym znaku
cmp al,'D' ; dec to juz jest ustawione
je @wczytaj
cmp al,'B'
jne @hex
mov [mnoznik],2 ; bin
jmp @wczytaj
@hex:
cmp al,'H'
jne @licz
mov [mnoznik],16 ; hex
jmp @wczytaj
@licz:
cmp al,64
ja @duze
cmp al,47
ja @liczby
jmp @error ; za mala wartosc
@duze:
sub al,7
@liczby:
mov bx,word ptr cs:[mnoznik]
sub al,48
cmp al,bl
jnb @error2 ; za duza wartosc
push ax
mov ax,word ptr cs:[liczba]
xor dx,dx ; czy to w ogole potrzebne ?
mul bx
pop bx
cmp dx,0
jne @error2 ; wynik mnozenia nie miesci sie w ax ?
add ax,bx
jo @error2 ; licznik sie przekrecil ?
mov word ptr cs:[liczba],ax
jmp @wczytaj
@error:
cmp al,27 ; esc ?
je @koniec
cmp al,13 ; enter ?
je @koniec ; z braku laku tez koniec
@error2:
; ...
; tu cos, co wypisze blad
; ...
@koniec:
mov ax,4c00h
int 21h
liczenie ends
end start
// to dziala, ale moznaby to jeszcze poprawić.