Latest Entries »

Sunday, July 4, 2010

#ASM. Wyświetlanie danych z bufora klawiatury. Mój pierwszy sukces.

Dzień dobry. Dzisiaj chciałbym zaprezentować przykład prostego programu w assemblerze. Program ten wyświetla napis proszący o podanie imienia, a następnie go wyświetla w nowej linii. Do poprawnego skompilowania i uruchomienia potrzeba tasm.exe, tlink.exe, oraz DPMIMEM.DLL
Kompilacja : tasm prog1.asm
Linkowanie: tlink prog1.obj
Wynik: prog1.exe



;Moj 1 program wczytuje dane z bufora i je wyswietla
MODEL TINY
STACK 24H
DATASEG
 napis db "Podaj swoje imie: $"
 imie db 20,0,10,13,20 dup("$")
 enters db 10,13,"$"
CODESEG
START:
 xor ax,ax ;zerowanie ax dla pewnosci
 mov ax,@DATA
 mov ds,ax
 ;wyswietlenie napis
 lea dx,napis;mov dx,offset napis
 mov ah,9
 int 21h
 ;wczytaj do imie
 mov ah,0ah
 mov dx, offset imie
 int 21h
 ;wyswietl znak powrotu karetki i nowej linii
 mov ah,9
 mov dx,offset enters
 int 21h
 ;wyswietl dane z imie
 mov ah,9
 mov dx, offset[imie+2]
 int 21h
 ;czekanie na znak
 mov ah,8
 int 21h
 mov ah,4ch;mov ax,4c00h
 int 21h
END START


Zacznijmy od początku, czyli deklaracji zmiennych:

napis db "Podaj swoje imie: $"
 imie db 20,0,20 dup("$")
 enters db 10,13,"$"

Pierwsza zmienna wyświetla się na początku programu i jest deklarowana jako declare byte.
Druga zmienna to ciąg bajtów w których: 20 oznacza maksymalną długość bufora, 0 będzie oznaczać realną wczytaną długość bufora z klawiatury.Z kolei 20 dup("$") dla TASM-a oznacza zadeklarowanie 20 bajtów o zawartości $. Dlaczego? Ponieważ każdy ciąg znaków w asm musi się kończyć znakiem dolara.

xor ax,ax ;zerowanie ax dla pewnosci
 mov ax,@DATA
 mov ds,ax

W tym miejscu przenosimy segment danych do rejestrów ds i ax.

;wyswietlenie napis
 lea dx,napis;mov dx,offset napis
 mov ah,9
 int 21h

Tutaj wrzucamy do dx offset(przesunięcie względem segmentu) zmiennej napis, następnie do ah wrzucamy wartość 9 i wywołujemy przerwanie dos-a 21H.

;wczytaj do imie
 mov ah,0ah
 mov dx, offset imie
 int 21h

Tak samo jak powyżej ale korzystamy z funkcji 0Ah przerwania 21H dos-u. W rejestrze DX będzie spoczywał wpisany ciąg do bufora.

;wyswietl znak powrotu karetki i nowej linii
 mov ah,9
 mov dx,offset enters
 int 21h
 ;wyswietl dane z imie
 mov ah,9
 mov dx, offset[imie+2]
 int 21h
 ;czekanie na znak
 mov ah,8
 int 21h
 mov ah,4ch;mov ax,4c00h
 int 21h

W powyższym fragmencie powtarzamy wyświetlenie danych(ah 9,int 21H) z tym, że w wyświetlaniu danych z imienia zaczynamy od 2 bajtu(0 bajt zarezerwowaliśmy na długość ciągu, 1 bajt dla faktycznej długości ciągu. Liczymy od zera of course.). Na koniec czekamy na dowolny klawisz klawiatury.

Na koniec podrzucam bardzo pomocną literaturę:
Polski kurs asm:http://rudy.mif.pg.gda.pl/~bogdro/
Zbiór wszystkich przerwań dosu:http://www.ctyme.com/intr/int.htm

Pozdrowienia!

1 comments:

Anonymous said...

Wielkie dzięki za wytłumaczenie. Tego właśnie szukałem :)

Post a Comment