Witam
Na studiach piszemy program w assemblerze dla procesora intel 8086, który jak wiadomo jest emulowany w dzisiejszych procesorach. Mniejsza z tym.
Więc mam do napisania program:
-
Program pobiera ciąg 5 znaków.
-
Te znaki zostają sprawdzone pod kątem czy są to cyfry w przedziale od 0 do 9.
-
Jeśli okazuje się to liczba wpisujemy ją do zmiennej “suma” typu “dw” w segmencie danych.
Oto mój program:
DosIntr equ 21h
RetToDos equ 4Ch
OK equ 0h
Progr segment
assume cs:Progr,ds:dane,ss:stosik
Start: mov ax,dane
mov ds,ax
mov ax,stosik
mov ss,ax
mov sp,offset szczyt
--------------------------------------------------- powyższy fragment dostaliśmy jako szablon
lea dx,tekst
mov ah,9 // Wyświetlenie prośby o wpisanie liczby z przedziału 0 do 65535
int DosIntr
lea dx,dlbuf
mov ah,0Ah // wczytanie znaków do łańcucha znaki
int 21h
lea dx,enterr
mov ah,9 // linia przerwy
int DosIntr
CMP ile,0 // jak nic nie zostało wpisane to komentarz o braku liczby
JE komentarz1
xor ch,ch
xor ax,ax // wyczyszczenie rejestrów CH oraz AX i przeniesienie do rejestru CL informacji o ilości wprowadzonych znaków
mov cl,ile
sub cl,'1'
Ppetli: mov SI,krok
mov al,znaki[SI]
sub al,'0'
mov ah,al
mov sub ah,10
JNC komentarz2
add bx,ax
JC komentarz3
CMP krok,cx
JE komentarz4
INC krok
mul bx;mnoznik
JMP Ppetli
komentarz1: mov dx,offset tekst1
mov ah,9
int DosIntr
jmp koniec
komentarz2: mov dx,offset tekst2
mov ah,9
int DosIntr
jmp koniec
komentarz3: mov suma,bx
mov dx,offset tekst3
mov ah,9
int DosIntr
jmp koniec
komentarz4: mov dx,offset tekst4
mov ah,9
int DosIntr
jmp koniec
koniec: mov ah,RetToDos
mov al,OK
int DosIntr
Progr ends
dane segment
dlbuf db 6
ile db 0
znaki db 7 dup ("$")
mnoznik db '10'
lancuch db '0123456789ABCDEF'
tekst db 'Prosze wpisac liczbe w zakresie od "0" do "65535"',10,13,'$'
tekst1 db 'Nic nie zostalo wpisane',10,13,'$'
tekst2 db 'Zle wpisana liczba',10,13,'$'
tekst3 db 'Liczba za duza','$'
tekst4 db 'Mam liczbe','$'
enterr db 10,13,'$'
suma dw 0
krok dw 0
dane ends
stosik segment
dw 100h dup(0)
szczyt label word
stosik ends
Algorytm został właśnie w taki sposób wypisany bo został nam nijako narzucony. Więc co nie działa… Sprawdza niby wszystko poprawnie jeśli wprowadzę jeden znak. Gdy wprowadzę więcej to komentarz jest uzależniony od tego czy wprowadzę jako pierwszy znak liczbę czy nie - tak jakby wczytywanie znaków do rejestru al nie przesuwało się (sprawdza tylko 1 znak).
Proszę o pomoc. Gdy pokazałem ten algorytm na zajęciach prowadzący nie zauważył żadnego błędu i nie wie co jest nie tak… jednocześnie to były przed ostatnie zajęcia… na następnych JA to muszę oddać i to JA dostanę ocenę końcową z możliwością zwolnienia egzaminu.
Proszę o wychwycenie tylko i wyłącznie tego błędu.