Witam,
Mam do zrobienia programik wczytujacy 2 liczby z zakresu [-32768-32767] nastepnie wczytana liczbe przerabia z ASCII na kod U2
dodaje do siebie liczby, znowu przerabia na ASCII i wyswietla. Wiekszosc jest zrobiona, dodawanie dziala, dla liczb ujemnych i dodatnich sprawdzalem po kodach ascii, niestety za nic nie moge zmusic go do wyswietlenia wyniku ktory jest ujemny oraz niektore wyniki dodatnie tez zle liczy cos jest dziwne.
Siedze juz na tym 2 dni i stanalem w miejscu, wiec prosze o pomoc
Z gory dziekuje
.MODEL TINY
MAX_ZNAKOW EQU 5 ; maksymalna liczba znakow
; liczby wprowadzanej przez
; uzytkownika
CRLF EQU 13,10 ; znak nowej linii
WczytajZnak MACRO
mov ah, 08h
int 21h
ENDM
WyswietlZnak MACRO Znak
mov dl, Znak
mov ah, 02h
int 21h
ENDM
WyswietlNapis MACRO Napis
mov dx, OFFSET Napis
mov ah, 09h
int 21h
ENDM
Kod SEGMENT
ORG 100h
ASSUME CS:KOD, DS:KOD
Sumuj MACRO s1, s2, sm
mov word ptr sm, 0
mov word ptr sm+1, 0
mov ah, byte ptr s1
mov dh, byte ptr s2
add ah, dh
mov byte ptr sm, ah
mov ah, byte ptr s1+1
mov dh, byte ptr s2+1
add ah, dh
mov byte ptr sm+1, ah
ENDM
Start:
jmp Instrukcje
Skladnik1 DW (?), '$'
Skladnik2 DW (?), '$'
Suma DD (?), '$'
TMPSkl1 DW (?)
TMPSkl2 DW (?)
BuforTekstu DB ?, ?, ?, ?, ?, '$'
txtPowitanie DB "Program sumuje dwie liczby calkowite z zakresu "
DB "[-32768..32767].$"
txtZlec1 DB CRLF,"Podaj pierwsza liczbe: $"
txtZlec2 DB CRLF,"Podaj druga liczbe: $"
txtWynik DB CRLF,"Wynik wynosi: $"
txtBlad DB CRLF,"Przekroczono zakres.$"
Ujemna DB ?
Zakres DB ?
Konwertuj PROC NEAR
xor dx, dx
xor ch, ch
mov Zakres, ch
mov WORD PTR TMPSkl1 + 2, dx
Przygotuj:
mov al, [bx]
inc bx
cmp al, '$'
je Znak
sub al, '0'
mov cl, al
mov ax, dx
mov dx, 000Ah
mul dx
add ax, cx
cmp dx, 0000h
jne Blad
cmp ax, 8000h
jb Dalej
je Sprawdz
Blad:
mov al, 01h
mov Zakres, al
xor dx, dx
jmp KoniecKW
Dalej:
mov dx, ax
jmp Przygotuj
Sprawdz:
cmp dl, Ujemna
je Blad
jmp Dalej
Znak:
xor al, al
cmp al, Ujemna
je KoniecKW
cmp dx, 0000h
je KoniecKW
sub dx, 0001h
xor dx, 0FFFFh
mov WORD PTR TMPSkl1 + 2, 0FFFFh
KoniecKW:
; w dx oraz w poczatkowych 16 bitach znajdzie sie 16-bitowa
; postac obliczeniowa U2 (bity 16-32 zmiennej liczba zostaly
; juz ustawione)
mov WORD PTR TMPSkl1, dx
ret
ENDP
WczytajLiczbe PROC NEAR
mov Ujemna, 0
WczytajZnak
cmp al, '-'
jne Wczytaj
mov Ujemna, 1
WyswietlZnak al
Wczytaj:
WczytajZnak ; wczytaj znak bez echa
cmp al, 0Ah
je Koniec
cmp al, 0Dh
je Koniec
cmp al, '0' ; czy znak jest cyfra?
jb Wczytaj ; nie - ignoruj znak i przejdz do wczytania kolejnego
cmp al, '9'
ja Wczytaj
mov [bx], al ; tak - zapamietaj znak w buforze
inc bx ; zwieksz pozycje wskaznika w buforze
WyswietlZnak al ; wyswietl wczytany znak
loop Wczytaj
Koniec:
mov al, '$'
mov [bx], al
ret
WczytajLiczbe ENDP
Zeruj PROC NEAR
mov cx, MAX_ZNAKOW
xor al, al
PetlaZerowania:
mov [bx], al
inc bx
loop PetlaZerowania
ret
ENDP
PROC Wypisz NEAR
mov ax, WORD PTR suma
mov cx, WORD PTR suma + 2
cmp ch, 80h
jb Dodatnia
cmp ax, 0000h
jne Ok
sub cx, 0001h
Ok:
sub ax, 0001h
xor cx, 0FFFFh
xor ax, 0FFFFh
mov dl, '-'
mov bx, ax
WyswietlZnak dl
mov ax, bx
Dodatnia:
mov bx, OFFSET buforTekstu
add bx, 04h
mov dx, cx
PetlaWL:
mov cx, 10
div cx
mov [bx], dl
xor dx, dx
dec bx
cmp ax, 0000h
jne PetlaWL
Wypisywanie:
inc bx
mov dl, [bx]
cmp dl, '$'
je KoniecWL
add dl, '0'
WyswietlZnak dl
jmp Wypisywanie
KoniecWL:
ret
ENDP
Instrukcje:
WyswietlNapis txtPowitanie
WyswietlNapis txtZlec1
mov bx, OFFSET BuforTekstu
mov cx, MAX_ZNAKOW
call WczytajLiczbe
mov bx, OFFSET BuforTekstu
call Konwertuj
cmp Zakres, 1
je Wyjdz
mov Skladnik1, dx
mov bx, OFFSET BuforTekstu
call Zeruj
WyswietlNapis txtZlec2
mov bx, OFFSET BuforTekstu
mov cx, MAX_ZNAKOW
call WczytajLiczbe
mov bx, OFFSET BuforTekstu
call Konwertuj
cmp Zakres, 1
je Wyjdz
mov Skladnik2, dx
Sumuj Skladnik1, Skladnik2, Suma
WyswietlNapis Suma
WyswietlNapis txtWynik
call Wypisz
mov ax, 4C00h
int 21h
Wyjdz:
WyswietlNapis txtBlad
mov ax, 4C00H
int 21h
Kod ENDS
END Start