Assembler 8086 pomoc

0

Witam, jestem na pierwszym roku studiow zaocznych, kierunek: informatyka. Jezeli chodzi o jezyk C to radze sobie w miare dobrze, gorzej z assemblerem.
Jak wiadomo za niedlugo sesja, czasu do nauki malo bo praca itp. Robie sobie rozne zadania ze stronki naszego wykladowcy i w kilku zadaniach mam problem.
W jednym z nich mam za zadanie zadeklarowac procedure pobierajaca znak z klawiatry z przerwania int 21h tak aby wyswietlala znak kolejny np. wciskam klawisz "a" pokazuje b itp.
procedure mam wywolac 3 razy. Nie wiem gdzie robie blad, czy moglby ktos rzucic okiem na kod i ewentualnie cos podpowiedziec? Problem jest taki, że niby pobiera 3 razy znak, ale pokazuje ten sam a nie kolejny tj wciskam "aaa", pokazuje "aaa", a powino "bbb"

.model tiny
.code
org 100h
start:
jmp poczatek

	znak:	
	mov ah,1
	inc al
	int 21h

	ret 		
poczatek:
	call znak
	call znak
	call znak
koniec:

	mov ax,4C00h
            int 21h
    

end start

0

to dlatego, że czytasz z echem, użyj funkcji, która nie wyświetla znaków, podmień i dopiero wypisz

0

Dzięki za odpowiedź. Mamy korzystać tylko z tych przerwań: Wybrane przerwania DOS-u:

int 21h
funkcja 1 - czytaj klawisz:
Argumenty:
AH = 1
Zwraca:

AL = kod klawisza ASCII

funkcja 2 - wyświetl znak:
Argumenty:
AH = 2
DL = kod ASCII znaku do wypisania

funkcja 9 - wyświetl napis:
Argumenty:
AH = 9
DS:DX = adres łańcucha znaków zakończonego znakiem dolara $

funkcja 2A - pobierz datę systemową:
Argumenty:
AH = 2Ah
Zwraca:

CX = rok (1980-2099)
DH = miesiąc
DL = dzień
podobno AL = dzień tygodnia (0=niedziela)
funkcja 2C - pobierz czas systemowy:
Argumenty:
AH = 2Ch
Zwraca:

CH = godzina
CL = minuta
DH = sekunda
DL = setne sekundy (nie zawsze)

int 16h (obsługa klawiatury)
funkcja 0 - pobierz kod naciśniętego klawisza (lub czekaj na naciśnięcie):
Argumenty:
AH = 0
Zwraca:

AH = BIOSowy kod klawisza (skankod)
AL = kod klawisza ASCII

funkcja 1 - sprawdź, czy naciśnięto klawisz:
Argumenty:
AH = 1
Zwraca:

flaga ZF=1, gdy nie naciśnięto klawisza
flaga ZF=0, gdy naciśnięto klawisz:
AH = BIOSowy kod klawisza (skankod)
AL = kod klawisza ASCII
Co do twojej rady to próbowałem zrobić coś takiego:
jmp poczatek
skan:
mov ah,0
mov al,dl
inc dl
int 16h

ret	
wypisz:
	mov ah,2
	int 21h
ret
poczatek:
	call skan
	call wypisz
	
	
koniec:
mov ax,4C00h
    int 21h

Teraz jak wcisnę "a" to wyświetla mi takie coś ô.

0

Bo nie umiesz czytać? Masz jak byk napisane że to twoje int 16h zwraca kod klawisza w al a twoje wypisanie bierze wartość z dl to czego tu się spodziewasz? O tym że inc robisz przed zamiast po wczytaniu danych to nawet nie mówię...

0
  1. najpierw musisz wywołać przerwanie, potem zmieniać wynik
  2. wynik będzie w AL, trzeba go przenieść do DL (u Ciebie jest na odwrót)
skan:
mov ah,0
int 16h
mov dl,al
inc dl
ret 
0

Ok dzięki wielkie. Głupota taka i zawracałem wam głowę, ale robię to w pracy jak tylko mam troche luzu i nie zawsze mam czas na głębsze zastanowienie się nad kodem czy przeanalizowanie go.

0

Mam jeszcze jedno pytanie. Toche podobne do wcześniejszego. Program ma pobrać dwie cyfry potem je zsumować a wynik zapisać w rejestrze BL. W treści podane jest że aby wartość znaku ascii odpowiadała wartości wprowadzanych cyfr, należy odjąć od pobranej wartości liczbę 48.Do pobrania wartości mam użyć funcji AH = 1 przerwania int 21h.

Czyli najpierw wywołuje pierwsze przerwanie np mov ah,1 int 21h pobrana wartośc zapisana jest w AL teraz muszę od al odjąć to 48 czyli sub al,48. Teraz wywołać 2 raz tylko żeby mi nie nadpisało w AL to zapisze to mov bh,1 i teraz odejmuje sub bl,48. Teraz dodać add al,bl wynik powinien zapisać się w al tak? I teraz tak jak wczesniej muszę wynik z AL przenieść do DL wyświetlić ah,2, a po wyświetleniu z DL do BL?
Edit: OK poradziłem sobie sam. Dzięki wielkie za wcześniejszą pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1