my program runs, but unfortunately it is in an infinite loop on the first task
y = a / b + c
Liczby wprowadzamy w kodzie szesnastkowym (HEX)
Wprowadz liczbe a
It asks here for the first number a in hexadecimal code.
no matter what I put in, the program keeps looping on this task.
I don’t see the possible solution for this problem.
Here is the instruction for my program
Design and run a procedure in 80×86 assembly language that implements na
8 byte variables operation:
multiplication,
division,
determining the remainder of division (modulo),
adding
to determine the result of the equation:
a y = a % b + c
b y = a / b + c
c y = a * b + c
d y = (a + b) % c
e y = a + b % c
f y = a + b * c
g y = a + b / c
h y = (a / b) % c
i y = a * (b + c)
We display the input data on the screen entered in hexadecimal code,
operation sign and result in hexadecimal code. For the result of the operation with
error, we display “***” in the result field.
Use fast multiplication or division algorithm in the program
Here is the code
format PE Console 4.0
entry start
include 'WIN32A.INC'
include 'win_macros.inc'
section '.text' code readable executable
start:
wyswietl txt5
wyswietl txt6
loop_1:
wyswietl txt1
mov ecx, 8
mov esi, 7
zmienna_A:
call pobierz_znak ;funkcja pobrania znaku
shl al,4 ;przesuniecie bitowe w lewo
push ax ;wrzucenie na stos rejestru ax
call pobierz_znak
pop dx ;zdjecie ze stosu
add al,dl
mov byte[zm1+esi],al ;byte - odwolanie sie do jednego bajtu zmiennej (esi - oznacza, do ktorego bajta sie odwolujemy) ;przypisanie odpowiedniego bajtu do rejestru al
dec esi ;dekrementacja esi
loop zmienna_A
jmp loop_2
loop_2:
wysw_znak 13
wysw_znak 10 ;endl
wyswietl txt2
mov cx, 8
mov esi, 7
zmienna_B:
call pobierz_znak
shl al,4
push ax
call pobierz_znak
pop dx
add al,dl
mov byte[zm2+esi],al
dec esi
loop zmienna_B
jmp loop_3
loop_3:
wysw_znak 13
wysw_znak 10
wyswietl txt3
mov cx, 8
mov esi, 7
zmienna_C:
call pobierz_znak
shl al,4
push ax
call pobierz_znak
pop dx
add al,dl
mov byte[zm3+esi],al
dec esi
loop zmienna_C
jmp dalej
dalej:
mov bx,0 ;licznik przesuniec
mov dl,0
jmp sprawdzenie_1
sprawdzenie_1:
mov esi, 7
jmp sprawdzenie_1.1
sprawdzenie_1.1:
dec esi
sprawdzenie_1.2:
mov al, byte[zm2+esi] ;bitowa wartosc [zm2+esi]
cmp al, 0
jne dziel_a
cmp esi, 0
jne sprawdzenie_1 ;jezeli b = 0 to wyswietla '***'
jmp bledny_wynik
dziel_a:
mov al,byte[zm2+7] ;przypisanie 7 bajta (7 czesc bitową) do rejestru al - rejestr 8 bitowy / 1 bajtowy
rcl al,1 ;przesuniecie w lewo z zachowaniem wysunietego bitu w fladze carry
jc dziel_d ;jezeli flaga carry != 0
dziel_b:
mov ecx,8
mov esi,0
clc ;ustawia flage carry na 0
dziel_c:
mov al,byte[zm2+esi]
rcl al,1
mov byte[zm2+esi],al
inc esi
loop dziel_c
inc bx ;licznik przesuniec
jmp dziel_a
dziel_d:
mov esi,7
jmp dziel_d.1
dziel_d.1:
dec esi
jmp dziel_d.2
dziel_d.2:
mov al,byte[zm1+esi]
mov ah,byte[zm2+esi] ; porównujemy czy dzielna >= dzielnik
cmp al,ah
ja dziel_e
mov dl,0
jb dziel_g
cmp esi,0
jne dziel_d.1
jmp dziel_e
dziel_e: ;odejmowanie krok 3
mov ecx,8
mov esi,0
clc
dziel_f:
mov al,byte[zm1+esi]
mov dl,byte[zm2+esi]
sbb al,dl
mov byte[zm1+esi],al ; działanie dzielna = dzielna - dzielnik (A = A - C)
inc esi
loop dziel_f
mov dl,1 ; ustawiamy w miejsce C ze schematu liczbe 1
dziel_g:
mov ecx,8
mov esi,0
clc
dziel_h:
mov al,byte[wynik1+esi] ; przesuwamy zmienną wynikową o 1 w lewo
rcl al,1
mov byte[wynik1+esi],al
inc esi
loop dziel_h
dziel_i:
add byte[wynik1],dl ;do pierwszego bajtu wyniku1 dodajemy rejestr dl
cmp bx,0
jne dziel_j ; porównujemy licznik przesuniec do 0 jesli nie to skok do porównania dzielnej z dzielnikiem
cmp bx,0
je dodaj_1
dziel_j:
dec bx
mov ecx,8
mov esi,7
dziel_k:
mov al,byte[zm2+esi]
rcr al,1 ;przesuniecie w prawo z uwzglednieniem flagi carry
mov byte[zm2+esi],al
dec esi
loop dziel_k
jmp dziel_d
dodaj_1:
mov ecx,8
mov esi,0
clc
dodaj_2:
mov al,byte[wynik1+esi]
mov dl,byte[zm3+esi]
adc al,dl
mov byte[wynik3+esi],al
inc esi
loop dodaj_2
jmp wynik_1
wynik_1:
wysw_znak 10
wysw_znak 13 ;endl
wyswietl txt4
wynik_2:
mov esi,7
mov ecx,8 ;indeks wyswietlanego bitu
jmp wynik_3
wynik_2.a:
dec esi
wynik_3:
mov al,byte[wynik3+esi]
shr al,4
cmp al,10
jae wynik_4
add al,48
jmp wynik_5
wynik_4:
add al,55
wynik_5:
wysw_znak al ;pierwsza liczba bitu
wynik_6:
mov al,byte[wynik3+esi] ;przypisanie rejestrowi al bitowej wartosci [wynik3+esi]
shl al,4
shr al,4
cmp al,10
jae wynik_7
add al,48
jmp wynik_8
wynik_7:
add al,55
wynik_8:
wysw_znak al ;druga liczba bitu
loop wynik_2.a
jmp last
bledny_wynik:
wysw_znak 10
wysw_znak 13
wyswietl txt4
wysw_znak 42
wysw_znak 42
wysw_znak 42 ;dzielenie przez zero powoduje wyswietlenie gwiazdek
last:
wysw_znak 10
wysw_znak 13
wyswietl txt7
pob_znak
cmp al,'q'
je def_end
cmp al,'q'
jne last ;kiedy nie zostanie wcisniety klawisz q to zapetlenie
def_end:
end_prog
section '.data' data readable writeable
zm1 dq 0
wynik1 dq 0 ;dq = ( 64 bit => 8 bajtów )
wynik2 dq 0
wynik3 dq 0
zm2 dq 0
zm3 dq 0
txt5 db 'y = a / b + c ',10,13,0
txt6 db 'Liczby wprowadzamy w kodzie szesnastkowym (HEX)!',10,13,0
txt1 db 'Wprowadz Liczbe a:',10,13,0
txt2 db 'Wprowadz Liczbe b:',10,13,0
txt3 db 'Wprowadz Liczbe c:',10,13,0
txt4 db 'a / b + c = ',0
txt7 db 'Aby zakonczyc program wcisnij klawisz "q"',0
pobierz_znak:
ety1: ;zakres wprowadzanych danych
pob_znak
cmp al,'0'
jb start
cmp al,'9'
jbe cyfra
cmp al,'A'
jb start
cmp al,'F'
jbe duza_litera
cmp al,'a'
jb start
cmp al,'f'
ja start
mala_litera:
push ax
wysw_znak al
pop ax
sub al,87
jmp ety2
duza_litera:
push ax
wysw_znak al
pop ax
sub al,55
jmp ety2
cyfra:
push ax
wysw_znak al
pop ax
sub al,48
ety2:
ret