Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

nyac55

Assembler - problem z prgramem - wczytanie liczby znaku z klawiatury?

Polecane posty

Witam. Mam problem z wprowadzeniem znaku z klawiatury ,gdyż program ma działać tak ,że np. po naciśnięciu klawisza l przechodzi do odpowiedniej etykiety. Obecnie program przechodzi tylko raz ,a gdy chcę wprowadzić kolejny znak i zastąpić ten stary ,następnie porównać czy w al wprowadził 1 czy 0 -> ,albo mi tego nie robi ,albo w kodzie poniżej jest jakiś błąd.


format MZ
entry main:start
stack 100h

macro wypisz txt
{
mov dx,txt
mov ah,9
int 21h
}

macro ustaw_kursor A,B
{ mov bh,0
mov dh,A
mov dl,B
mov ah,2
int 10h
}

segment main
start:
mov ax,dane ;ustalnie segmentu danych
mov ds,ax

wypisz txt1 ;legenda menu
wypisz txt2
wypisz txt3
wypisz txt4
wypisz txt5
wypisz txt6
wypisz txt7

wypisz dana1 ;wyswietla 1 dana i wartosc
wypisz spacja
wypisz zm1
wypisz znak1

wypisz dana2 ;wyswietla 1 dana i wartosc
wypisz spacja
wypisz zm2
wypisz znak2

wypisz wynik ;wyswietla wynik
wypisz wyn
call pob_znak
mov ah,4ch
int 21h


pob_znak:

mov ah,7
int 21h

cmp al,'L'
je l
cmp al,'l'
je l
cmp al,'P'
je p
cmp al,'p'
je p
cmp al,'W'
je w
cmp al,'w'
je w
jmp pob_znak

l: ;pobiera znak pod zm1
;wypisz txt1
wypisz dal
ustaw_kursor 8,12
;wypisz dal
mov ah,7
int 21h
;ret
cmp al,'1'
je l1
l1:

loop l
mov cx,8
add [zm1],al
shl [zm1],1
loop l
wypisz zm1

mov ah,7 ;czekamy na enter
int 21h
cmp al,13
jmp l

cmp al,'0'
rcl[zm1+0],1
;add [zm1],al
;shl [zm1],1
mov ah,7
int 21h ;czekamy na enter
jmp l


p: ;pobiera znak pod zm2
wypisz txt2
mov ah,7
int 21h
ret
w:

ret
kor:



esc:
mov ah,4ch
int 21h

segment dane
txt1 db '- <L> - wybor dane1',10,13,'$'
txt2 db '- <P> - wybor dane2',10,13,'$'
txt3 db '- <W> - wykonanie operacji',10,13,'$'
txt4 db '- <1>, <0> - wprowadzenie wartosci danej',10,13,'$'
txt5 db '- <Enter> - akceptacja danej',10,13,'$'
txt6 db '- <BS> - korekta',10,13,'$'
txt7 db '- <Esc> - wyjscie z programu',10,13,'$'
dal db 'L$'

dana1 db 10,13,'Dana 1 =$'
znak1 db ' -',10,13,'$'
dana2 db 'Dana 2 =$'
znak2 db ' =',10,13,'$'
wynik db 'Wynik =$',10,13
zm1 db 48
zm2 db 30h
wyn db 10,13,'$',10,13
spacja db ' $'

Link do komentarza
Udostępnij na innych stronach

Moje prace nad programem liczącym:


format MZ
entry main:start
stack 100h

macro wypisz txt
{
mov dx,txt
mov ah,9
int 21h
}

macro ustaw_kursor A,B
{ mov bh,0
mov dh,A
mov dl,B
mov ah,2
int 10h
}

segment main
start:
mov ax,dane ;ustalnie segmentu danych
mov ds,ax

mov ax,3 ;clr scr
int 10h

wypisz txt1 ;legenda menu
wypisz txt2
wypisz txt3
wypisz txt4
wypisz txt5
wypisz txt6
wypisz txt7

wypisz dana1 ;wyswietla 1 dana i wartosc
wypisz spacja
wypisz zm1
wypisz znak1

wypisz dana2 ;wyswietla 1 dana i wartosc
wypisz spacja
wypisz zm2
wypisz znak2

wypisz wynik ;wyswietla wynik
wypisz wyn
call pob_znak
call wysw_bin


pob_znak:

mov ah,7
int 21h

cmp al,'L'
je pierwsza_dana
cmp al,'l'
je pierwsza_dana
cmp al,'P'
je druga_dana
cmp al,'p'
je druga_dana
cmp al,'W'
je w
cmp al,'w'
je w
cmp al, 8
je bs
cmp al, 27
je esc
jmp pob_znak

mov cx,8 ; TA DEKLARACJA (przesunięcie) NIGDY CI SIĘ NIE WYKONA, przeskakujesz ten fragment programu

pierwsza_dana:
mov cx,8 ; przesunąłem ją tutaj, teraz się wykona, w cx były śmieci, dlatego program Ci sę zapętlał
wypisz txt1
;wypisz dal
jmp dan1
petla: ;pobiera znak pod zm1
shl [zm1],1 ; M - przesunąłem to tutaj, bo po ostatnim przebiegu pętli przesunął by Ci o 1 w lewo całą zmienną
dan1:
;ustaw_kursor 8,12

mov ah,7
int 21h

cmp al,13 ;enter
je ent

cmp al,'0'
jb dan1

cmp al,'1'
ja dan1

;cmp al,13 ;enter
;je ent

cmp al,8 ;backspace
je bs

mov ah,2 ;wyswiela wartosci
mov dl,al
int 21h

sub al,30h ;zamieniamy wartosc hex na bin
add [zm1],al ;doklejamy kolejne bity

loop petla
ustaw_kursor 8,12
call wysw_bin ;wyswietlenie zmiennej
mov ah,7
int 21h
jmp start

druga_dana: ;pobiera znak pod zm2
wypisz txt2
mov cx,8

petla2:
shl [zm1],1

dan2:
mov ah,7
int 21h

cmp al,'0'
jb dan2
cmp al,'1'
ja dan2

mov ah,2
mov dl,al
int 21h

sub al,30h
add [zm2],al

ustaw_kursor 10,12
;call wys2 ;wyswietlenie zmiennej
mov ah,7
int 21h

loop petla2

jmp start

w:


ent:
mov ah,2 ;wyswiela wartosci
mov dl,al
int 21h



bs:



esc:
wypisz txt7

mov ah,7
int 21h

mov ah,4ch
int 21h

;;;;;;;;;;;;;;;;;;;wyswietlanie;;;;;;;;;;;;;;;;;;;;;
wysw_bin:
mov cl,8
ety1:
push cx
rcl [zm1],1
jc ety2
mov dl,'0'
jmp ety3
ety2:
mov dl,'1'
ety3:
mov ah,2
int 21h
pop cx
loop ety1
rcl [zm1],1
ret

;;;;;;;;;;;;;;;;;;;;;


segment dane
txt1 db '- <L> - wybor dane1',10,13,'$'
txt2 db '- <P> - wybor dane2',10,13,'$'
txt3 db '- <W> - wykonanie operacji',10,13,'$'
txt4 db '- <1>, <0> - wprowadzenie wartosci danej',10,13,'$'
txt5 db '- <Enter> - akceptacja danej',10,13,'$'
txt6 db '- <BS> - korekta',10,13,'$'
txt7 db '- <Esc> - wyjscie z programu',10,13,'$'
dal db 'L$'

dana1 db 10,13,'Dana 1 =$'
znak1 db ' -',10,13,'$'
dana2 db 'Dana 2 =$'
znak2 db ' =',10,13,'$'
wynik db 'Wynik =$',10,13
zm1 db 0
zm2 db 0
wyn db 10,13,'$',10,13
spacja db ' $'

Program jeszcze nie jest w pełni sprawny.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...