Politechnika Rzeszowska Wydział Elektrotechniki i Informatyki Katedra Informatyki i Automatyki Laboratorium Programowanie niskopoziomowe Rzeszów 2004
Ćwiczenie 1. Zmienne, adresy, wskaźniki Celem ćwiczenia jest zapoznanie się ze sposobem deklaracji zmiennych i adresowania pamięci w języku asemblera procesora 8086. Zagadnienia do przygotowania deklaracje i interpretacje zmiennych w języku C wskaźniki i tablice, operacje na wskaźnikach struktury i unie budowa elementarnych programów w języku asemblera asemblacja, linkowanie i śledzenie programów w pakiecie Borland C 3.1 Przebieg ćwiczenia napisać program podany w załączniku w języku asemblera, np. lab1.asm przeprowadzić jego kompilację i linkowanie za pomocą pakietu Borland C 3.1: tasm /zi lab1.asm - asemblacja tlink /v lab1.obj - linkowanie wykonać sprawdzenie poprawności działania programu za pomocą Turbo Debugera. Warunki zaliczenia ćwiczenia Zaliczenie ćwiczenia polega na demonstracji działania programu prowadzącemu. Sprawozdanie Sprawozdanie powinno zawierać wydruk programu z obszernymi komentarzami zawierającymi wartości zmiennych po wykonaniu instrukcji oraz graficzną prezentację zadeklarowanych zmiennych strukturalnych (tablic, struktur i unii). Literatura Kernigham, Ritchie, Język C, WNT 1989 Dokumentacja pakietu Borland C 3.1 Wróbel Eugeniusz, Asembler 8086/88 Wacławek Roland, ABC Asemblera Scanlon Leo J., Assembler 8086/8088/80286 Kruk Stanisław, Język Assembler dla początkujących Nawrocki J. R., Programowanie komputerów IBM PC w języku Asemblera metodą systematyczną Syck Gary, Turbo Assembler : biblia użytkownika
Deklaracje zmiennych char c,c1,c2; int i; char Tabl[10]; char Napis[] = "asembler"; char *ptr; struct hilo char l; char h;; union u1 int i; struct hilo c;; union u1 utab[4]; union u1 *uptr; Instrukcje programu void main(void) c=1; i=-1; ptr=tabl; *ptr++=1; *ptr++=2; c=*((ptr--)-1); utab[0].i =0x2211; utab[1].c.l=0x33; utab[1].c.h=0x44; utab[2].c.l=0x55; utab[2].c.h=0x66; ptr=(char *)&utab[0]; i=*(ptr+1); ptr = (char *) ((union u1 *)ptr+1); c1=*ptr++; c2=*ptr++; uptr = utab; i=(uptr+1)->i; uptr++; i=(uptr+1)->i;
Ćwiczenie 2. Instrukcje warunkowe, wyboru i pętle Celem ćwiczenia jest zapoznanie się ze sposobem realizacji podstawowych instrukcji warunkowych oraz pętli w języku asemblera procesora 8086. Zagadnienia do przygotowania składnia i semantyka instrukcji if...then...else w języku C budowa instrukcji wyboru switch składnia i semantyka (schematy blokowe) pętli while... i for... instrukcje arytmetyczne i porównania procesora 8086 interpretacja znaczników w słowie stanu procesora rozkazy skoków warunkowych i bezwarunkowych (względnych i bezwzględnych). Przebieg ćwiczenia przygotować schemat blokowy programu podanego w załączniku w języku asemblera przeprowadzić jego kompilację i linkowanie za pomocą pakietu Borland C 3.1 sprawdzić poprawność działania programu za pomocą Turbo Debugera, zwrócić szczególną uwagę na prawidłowość warunku opuszczenia pętli i zawartość tablic. Warunki zaliczenia ćwiczenia Zaliczenie ćwiczenia polega na demonstracji działania programu prowadzącemu. Sprawozdanie Sprawozdanie powinno zawierać wydruk programu z obszernymi komentarzami oraz schematy blokowe wszystkich instrukcji strukturalnych. Literatura Kernigham, Ritchie, Język C, WNT 1989 Dokumentacja pakietu Borland C 3.1 Wróbel Eugeniusz, Asembler 8086/88 Wacławek Roland, ABC Asemblera Scanlon Leo J., Assembler 8086/8088/80286 Kruk Stanisław, Język Assembler dla początkujących Nawrocki J. R., Programowanie komputerów IBM PC w języku Asemblera metodą systematyczną Syck Gary, Turbo Assembler : biblia użytkownika
Deklaracje zmiennych char napis1[4] = ala ; char napis2[4]; char napis3[4]; char napis4[4]; char * ptr1,* ptr2; int i,j; Instrukcje programu void main(void) ptr1=napis1; ptr2=napis2; ptr3=napis3; /* kopiowanie lancuchow poprzez zmienne indeksy wskazowka zastosuj instrukcje typu MOV napis2[bx],al */ for(i=0,j=0; napis1[i]!=0; i++,j++) napis2[j]=napis1[i]; /* czy wartosci koncowe zmiennych indeksowych i,j sa zgodne ze standardem jezyka C? */ /* kopiowanie lancuchow poprzez wskazniki */ while(*ptr3++=*ptr2++); /* wskazówka wykorzystaj efektywnie instrukcje MOV [BX],AL */ /* instrukcja wyboru switch */ i=2; /* wskazowka: w programie zastosuj instrukcje... CMP AX,1 JE case1 CMP AX,2 JE case2... case1:...... case2: Zastanow sie, gdzie wstawic odpowiedniki break? Jakie znaczenie w tej konstrukcji ma default? Jaka wartosc ma zmienna j po wykonaniu instrukcji switch? */ i=0; switch (i) case 0: j=napis1[0]; case 1: j=napis1[1]; break; case 2: j=napis1[2];break; default: j='a';
Ćwiczenie 3. Realizacja funkcji, przekazywanie parametrów, stos i zmienne lokalne Celem ćwiczenia jest zapoznanie się ze sposobem realizacji funkcji, sposobów przekazywania parametrów przez stos oraz implementacji zmiennych lokalnych. Zagadnienia do przygotowania sposoby adresowania stosu rejestr SP interpretacja pojęcia zmiennej lokalnej, statycznej i dynamicznej Przebieg ćwiczenia przygotować schemat blokowy programu podanego w załączniku w języku asemblera, przeprowadzić jego kompilację i linkowanie za pomocą pakietu Borland C 3.1 sprawdzić poprawność działania programu za pomocą Turbo Debugera zwrócić szczególną uwagę na zawartość i rozmiar stosu przed i po zakończeniu wykonywania funkcji Warunki zaliczenia ćwiczenia Zaliczenie ćwiczenia polega na demonstracji działania programu prowadzącemu. Sprawozdanie Sprawozdanie powinno zawierać wydruk programu z obszernymi komentarzami oraz rysunki ilustrujące zawartość stosu w chwili wywołania funkcji i rozmieszczenie zmiennych lokalnych. Zwróć uwagę na rzutowanie typów. Literatura Kernigham, Ritchie, Język C, WNT 1989 Dokumentacja pakietu Borland C 3.1 Wróbel Eugeniusz, Asembler 8086/88 Wacławek Roland, ABC Asemblera Scanlon Leo J., Assembler 8086/8088/80286 Kruk Stanisław, Język Assembler dla początkujących Nawrocki J. R., Programowanie komputerów IBM PC w języku Asemblera metodą systematyczną Syck Gary, Turbo Assembler : biblia użytkownika
Deklaracje zmiennych int i,j; char c; char napis1[4]="ala"; char napis2[4]; char *ptr1,*ptr2; Program /* funkcja bez zmiennych lokalnych - przedstaw graficznie zawartosc stosu w trakcie wykonywania funkcji */ char *copy(char *p1,char *p2) /* W jaki sposob sa pobierane parametry? */ while(*p2++ = *p1++); return p2; /* W ktorym rejestrze zwracana jest wartosc wskaznika? */ /* funkcja ze zmiennymi lokalnymi i parametrami roznego rozmiaru - kopiowanie z ograniczeniem max. ilosci elementow */ int copy2(char *src,char *dst, char ile) int i=0; while(*dst++ = *src++) if(++i>=ile) break; *dst=0; return i; void main(void) ptr1=napis1; ptr2=napis2; (void) copy(ptr1,ptr2); /* Sprawdz, cz zawartosc stosu jest taka sama jak przed wywolaniem funkcji */ c=copy2(ptr1,ptr2,2); /* uwaga na niezgodnosc typow!!! */
Ćwiczenie 4. Funkcje rekurencyjne i biblioteczne Celem ćwiczenia jest zapoznanie się ze sposobem realizacji funkcji rekurencyjnej oraz wywoływania funkcji bibliotecznych z własnymi programami. Program w C do realizacji w asemblerze /* plik do laboratorium 4 z architektury komputerow II */ #include "stdio.h" /* funkcja rekurencyjna */ unsigned int silnia(int n) if (n<0) return -1; else if (n==0) return 1; else return n * silnia(n-1); //prototyp funkcji wieloargumentowej printf //int printf(const char * format, arg1, arg2,...); void main(void) int i=3; i=silnia(i); printf("%d",i); /* jaka jest kolejnosc parametrow? */ lab4.asm tasm.exe /zi lab4.asm CALL main _printf lab4.asm c0s.obj cs.lib lab4.exe tlink /v lab4.obj c0s.obj,lab4.exe,,cs.lib Informacje wprowadzające Program wynikowy zostanie otrzymany w wyniku połączenia modułu asemblerowego z modułem bibliotecznym cs.lib (z funkcją printf) oraz zbiorem c0s.obj zawierającym funkcje podstawowe środowiska borland C. W programie należy użyć dyrektyw PUBLIC i EXTRN. Uwaga: funkcja _main kończy się instrukcją RET. Jest ona wywoływana z modułu c0s.
Przebieg ćwiczenia przygotować plik lab4.asm wykonać kompilację i linkowanie sprawdzić za pomocą debugera poprawność działania programu (wskazówka: ustawić pułapki na etykietę _main) uruchomić lab4.exe z poziomu systemu DOS Warunki zaliczenia ćwiczenia Zaliczenie ćwiczenia polega na demonstracji działania programu prowadzącemu. Sprawozdanie Sprawozdanie powinno zawierać wydruk programu ze szczegółowym wyjaśnieniem zastosowanych dyrektyw asemblera i krótką charakterystyką wykorzystanych modułów bibliotecznych pakietu Borland C. Literatura Kernigham, Ritchie, Język C, WNT 1989 Dokumentacja pakietu Borland C 3.1 Wróbel Eugeniusz, Asembler 8086/88 Wacławek Roland, ABC Asemblera Scanlon Leo J., Assembler 8086/8088/80286 Kruk Stanisław, Język Assembler dla początkujących Nawrocki J. R., Programowanie komputerów IBM PC w języku Asemblera metodą systematyczną Syck Gary, Turbo Assembler : biblia użytkownika
Laboratorium Architektury Komputerów II Ćwiczenie 5. Funkcje biosu, dos i programy rezydentne Celem ćwiczenia jest napisanie prostego programu rezydentnego przy wykorzystaniu funkcji dostępnych w systemie operacyjnym. Program w C do realizacji w asemblerze // #include "dos.h" void interrupt (*old_1c)(void); //wskaznik daleki int volatile i; //zachowaj wszystkie rejestry na stosie void interrupt new_1c(void) i++; //w tym miejscu wyswietl znak wyznaczony jako // (i%10)+'0' w lewym gornym rogu ekranu //1 - za pomoca funkcji BIOS-u (przerwanie int 10H*) //2 - bezposrednio adresujac pamiec ekranu old_1c(); //wywolanie starej funkcji obslugi przerwania //odtworz rejestry i powroc z przerwania void main(void) old_1c = getvect(0x1c); // pobierz wektor przerwania za // pomoca funkcji systemu DOS setvect(0x1c,new_1c); //ustaw wektor keep(0,512/16); //zakoncz program, zostawiając go rezydentnym Przebieg ćwiczenia przygotować plik lab5.asm wykonać kompilację i linkowanie uruchomić lab5.exe z poziomu systemu DOS Warunki zaliczenia ćwiczenia Zaliczenie ćwiczenia polega na demonstracji działania programu prowadzącemu. Sprawozdanie Sprawozdanie powinno zawierać wydruk programu z komentarzami. Literatura Kernigham, Ritchie, Język C, WNT 1989 Dokumentacja pakietu Borland C 3.1 Wróbel Eugeniusz, Asembler 8086/88 Scanlon Leo J., Assembler 8086/8088/80286 Kruk Stanisław, Język Assembler dla początkujących Syck Gary, Turbo Assembler : biblia użytkownika