instrukcja TM cw02 ASM


Laboratorium przedmiotu Technika Mikroprocesorowa
ćw. 2: Wprowadzenie do asemblera x86, system przerwań
Asembler x86:
Asembler jest to język programowania, nale\ący do języków niskiego poziomu.
Znaczy to tyle, \e jednej komendzie asemblera odpowiada dokładnie jeden rozkaz
procesora. Asembler operuje na rejestrach procesora. Do naszych celów będziemy
wykorzystywać 16-bitowe rejestry ogólnego przeznaczenia (AX, BX, CX, DX) oraz
wybrane 16-bitowe rejestry indeksowe, wskaznikowe i segmentowe. W celu badania
wyników operacji (logicznych lub arytmetycznych) wykorzystamy rejestr stanu
procesora.
Aby pierwsze spotkanie z asemblerem nie było zbyt trudne nasze programy
asemblerowe będziemy umieszczać jako cześć kodu projektu napisanego w języku
C++. W związku z tym wszelka notacja będzie taka jak w języku C++!!
Wykorzystywanym środowiskiem będzie Microsoft Visual Studio .NET oraz Borland
C++ 3.1.
W celu umieszczenia kodu asemblera w języku C++ stosujemy polecenie __asm.
Aby u\ywać zmiennych w programie mo\emy je zadeklarować zgodnie ze składnią
języka C++ (nale\y uwa\ać na typ zmiennej). Ka\dy z rejestrów 16-bitowych
mo\emy wykorzystać poprzez odwołanie bezpośrednio do ich 8-bitowych części
górnej lub dolnej (np. rejestr CX dzieli się na część starszą CH i młodszą CL).
00000000 | 00000000
CX(16b)
CH(8b) | CL(8b)
Chcąc wykorzystać pętle w programie posłu\ymy się skokami warunkowymi do
miejsc oznaczonych etykietami. Przykładowy kod programu z opisem jest
przedstawiony poni\ej:
int main (void)
{
unsigned short int Liczba1 = 0x1; //liczba 16-bitowa
unsigned char Liczba2; //liczba 8-bitowa
__asm {
push AX;
push BX;
push CX;
mov AL, 0x22;
mov AH, 3;
and AX, 0x00FF;
add AX, 10;
mov BX, Liczba1;
skok: sub AX, BX;
jnz skok;
pop CX;
pop BX;
pop AX;
&
}
return 0;
}
deklarujemy 2 zmienne Liczba1 i Liczba2 (przedstawiony sposób deklaracji
typów całkowitych 8 i 16 bitowych bez znaku);
3 instrukcje push słu\ą do zapisania na stosie kolejnych rejestrów, gdy\ bedą
one w programie modyfikowane;
do rejestru AL zapisujemy szesnastkową wartość 0x22, czyli 34 dziesiętnie
(zauwa\my, \e rejestr AL jest 8  bitowy);
do rejestru AH zapisujemy dziesiętną wartość 3. W efekcie dwóch powy\szych
operacji rejestr AX zawiera 3*256+34 = 802 dziesiętnie, czyli 0x0322
szesnastkowo;
wykonujemy operację logiczną and na wartościach 0x00FF i rejestrze AX,
wynik zapisujemy do AX. W wyniku tej operacji wyzerowana zostanie starsza
część rejestru AX. Teraz AX zawiera 0x0022 szesnastkowo;
dodajemy do AX 10, AX zawiera 44 dziesiętnie;
do rejestru BX wpisujemy zawartość zmiennej Liczba1, czyli 1;
od AX odejmujemy BX i wynik zapisujemy w AX (w naszym przypadku będzie
to zmniejszanie o 1)
je\eli wynik ostatniej operacji był niezerowy (instrukcja jnz) to skaczemy do
etykiety skok i wykonujemy kolejne odejmowanie, powtarzamy tą część
programu a\ do momentu wyzerowania AX, czyli u nas 44 razy;
pobieramy ze stosu (pop) wcześniej zapisane tam wartości (w odwrotnej
kolejności ni\ je zapisywaliśmy!!)
Przerwania:
Przerwanie jest to zatrzymanie wykonującego się w danej chwili programu i
przekazanie sterowania do procedury, która to przerwanie obsługuje. Po
zakończeniu się tej procedury następuje powrót do wcześniej wykonywanego
programu. Istnieją dwa rodzaje przerwań: przerwania sprzętowe i systemowe.
Przerwania sprzętowe wywoływane są w krytycznych sytuacjach (na \ądanie
urządzeń zewnętrznych). Ze względu na to, \e w jednej chwili mo\e zgłosić kilka
urządzeń \ądanie o przerwanie, a procesor w danej chwili mo\e obsłu\yć tylko jedno
z nich, ka\demu przerwaniu sprzętowemu przyporządkowano pewien numer
(priorytet). Numer ten mówi w jakiej kolejności nale\y wykonywać przerwania.
Przerwania sprzętowe mogą być maskowalne lub nie. Przerwania maskowalne nie
muszą być przekazywane do procesora w przeciwieństwie do przerwań
niemaskowalnych. Przerwania systemowe mogą być wywoływane tylko w sposób
programowy.
W naszych programach wykorzystamy systemowe przerwania DOS. Nie mo\na
wywołać tych przerwań umieszczając wstawkę asemblerową w kodzie C++. Dlatego
przerwania wywoływać będziemy z poziomu języka C++ w środowisku Borland C++
3.1. Przykład programu wyświetlającego tekst (u\ycie przerwania DOS 0x21):
int main (void)
{
char Napis[] =  Moj napis!$ ;
struct REGPACK reg;
reg.r_ax = 0x0900;
reg.r_dx = FP_OFF(napis);
reg.r_ds = FP_SEG(napis);
intr(0x21, ®);
return 0;
}
definiujemy zmienną Napis i strukturę reg przechowującą interesujące nas
rejestry;
Wpisujemy odpowiednie wartości do rejestrów, AH zawiera numer funkcji
przerwania 0x21 (funkcja nr. 9  czyli wyświetlanie tekstu), DX i DS zawierają
adres napisu w pamięci w formacie segment:offset  poniewa\ pracujemy w
C++ musimy u\yć fukcji FP_OFF i FP_SEG;
wywołujemy przerwanie przy określonych wartościach rejestrów, w wyniku
tego nasz napis zostanie wyświetlony;
Sposoby dostępu do portów:
W systemach Windows nowszych ni\ Windows 98 zabroniony jest dostęp
u\ytkownika do urządzeń I/O. Je\eli chcemy pod takim systemem uruchamiać
program odwołujący się do urządzeń I/O nale\y odblokować dostęp do urządzeń I/O.
Jedną z metod odblokowania go jest zastosowanie sterownika, np. giveio.sys
(np: http://www.embeddedtronics.com/public/Electronics/directio/). Po zainstalowaniu
go nale\y załączyć odpowiednie fragmenty kodu do programu:
- je\eli program pisany jest pod DOS:
--------------------------------------------------------------
int f = open("\\\\.\\giveio", O_CREAT, S_IREAD);
close(f);
--------------------------------------------------------------
- je\eli program pisany jest pod WINDOWS:
--------------------------------------------------------------
HANDLE h;
h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(h == INVALID_HANDLE_VALUE)
{
printf("Couldn't access giveio device\n");
return -1;
}
CloseHandle(h);
--------------------------------------------------------------
oraz dołączyć biblioteki, odpowiednio fcntl.h i sys/stat.h dla DOSa oraz windows.h dla
Windowsa.
Przebieg ćwiczenia:
Celem ćwiczenia jest zapoznanie studenta z praktycznym programowaniem w języku
asembler x86.
Przygotowanie do laboratorium:
praktyczna znajomość języka  C++ ;
umiejętność wykonywania operacji logicznych i arytmetycznych na liczbach
zapisanych w ró\nych systemach liczbowych;
podstawowa znajomość sposobu pisania kodu w asemblerze;
rozumienie pojęć: przerwanie, obsługa przerwania itp.;
linki;
Przebieg ćwiczenia i sposób oceniania:
kartkówka (max. 2 pkt);
szybkie zapoznanie ze środowiskiem programowania;
poznanie i zrozumienie podstawowych instrukcji asemblera x86;
stosowanie poznanych instrukcji do realizacji prostych programów
asemblerowych - wstawki asemblerowe w kodzie C++ (max 1 pkt);
realizacja bardziej zaawansowanego programu asemblerowego (max 1 pkt);
realizacja wybranych programów w oparciu o przerwania DOS (max 1 pkt);
* podczas ćwiczenia ka\da sekcja tworzy osobny protokół z przebiegu ćwiczenia
Protokół:
Protokół powinien zawierać:
nazwiska osób wykonujących ćwiczenie;
tytuł i numer ćwiczenia;
poprawny numer grupy i sekcji;
komentarze przedstawiające postęp w realizacji ćwiczenia;
Literatura:
http://rudy.mif.pg.gda.pl/~bogdro/ - kurs asemblera
http://binboy.sphere.pl/index.php?show=serwis&d=asm - kurs asemblera, przerwania
http://pl.wikibooks.org/wiki/Asembler_X86 - podstawy asemblera, lista instrukcji
...
Opracowanie: Mariusz Latos, 2007


Wyszukiwarka

Podobne podstrony:
instrukcja cw02
TM Lab Voicebox instrukcja
automat schodowy asm 01 instrukcja
instrukcja prezentacja2
instrukcja bhp przy obsludze euro grilla
DS1000PL Instrukcja
Blaupunkt CR5WH Alarm Clock Radio instrukcja EN i PL
Instrukcja do cwiczenia 4 Pomiary oscyloskopowe
Instrukcja F (2010)
Instrukcja Programowania Zelio Logic 2 wersja polska
Instrukcja kociol MODERATOR 75 200kW pl
Instrukcje 2

więcej podobnych podstron