Laboratorium: Wprowadzenie
Transkrypt
Laboratorium: Wprowadzenie
Architektura Systemów Komputerowych, Wydział Informatyki, ZUT Laboratorium: Wprowadzenie Pojęcia. Wprowadzone zostaną podstawowe pojęcia i mechanizmy związane z programowaniem w asemblerze. Dowiemy się co to są rejestry i jak z nich korzystać. Rejestry to są wewnętrzne „komórki” procesora, w których może on przechowywać wartości i na których wykonuje operacje. W zależności od typu procesora mogą być 16 bitowe (np. procesor 80286), 32 bitowe (np. procesor 80386 czy 80486) czy 64 bitowe (np. Intel i5). Na zajęciach poznamy rejestry 16 bitowe. Rejestry ogólnego przeznaczenia W skład bloku rejestrów ogólnego przeznaczenia wchodzą m.in. rejestry: arytmetyczne oraz indeksowe. Rejestry arytmetyczne Są to cztery 16-bitowe rejestry ogólnego przeznaczenia: AX, BX, CX, DX. Każdy z tych rejestrów może również działać jako dwa niezależne rejestry 8-bitowe: AX lub AH, AL – akumulator, wykorzystywany do operacji arytmetycznych BX lub BH, BL – bazowy, może być wykorzystany do adresowania CX lub CH, CL – licznik, wykorzystywany w np. w pętlach DX lub DH, DL - danych, wykorzystywany np. przy operacjach na portach Rejestry indeksowe SI – rejestr indeksowy źródła (Source Index). Uniwersalny rejestr indeksowy. Jest wykorzystywany w czasie dwuargumentowych operacji łańcuchowych do przetrzymywania adresu źródła danych. DI – rejestr indeksowy przeznaczenia (Destination Index). Uniwersalny rejestr indeksowy. Jest wykorzystywany w czasie dwuargumentowych operacji łańcuchowych do przetrzymywania adresu przeznaczenia danych. Rejestr znaczników (rejestr flag, rejestr stanu) Znaczniki lub flagi to jednobitowe komórki zawierające informacje o wynikach operacji wykonywanych przez procesor. Są one zawarte w specjalnym rejestrze. Wybrane znaczniki: CF – carry flag – znacznik przeniesienia; przyjmuje wartość 1, gdy przy odejmowaniu nastąpiła pożyczka, lub gdy przy dodawaniu nastąpiło przeniesienie; do rejestru CF przechodzi także bit przesunięty poza rejestr lub komórkę w wyniku operacji przesunięcia bitowego PF – parity flag – znacznik parzystości; przyjmuje wartość 1, gdy wynik operacji ma parzystą liczbę bitów o wartości 1, w przeciwnym wypadku przyjmuje 0; ZF – zero flag – znacznik zera; przyjmuje wartość 1, gdy wynik operacji jest zerem. W przeciwnym wypadku przyjmuje 0; Kontakt: [email protected] 1 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT SF – sign flag – znacznik znaku; przyjmuje wartość 1, gdy wynik operacji jest liczbą ujemną, w przeciwnym wypadku przyjmuje 0; DF – direction flag – znacznik kierunku; steruje zmianą rejestrów indeksowych przy operacjach powtarzających. Jeśłi DF = 1 to zawartość rejestru będzie zmniejszana, w przeciwnym wypadku będzie zwiększana. Sprawne posługiwanie znacznikami może znacznie ułatwić programowanie i przyspieszyć wykonywanie kodu. Skoki warunkowe Skoki warunkowe są wykorzystywane wszędzie tam, gdzie spełnione są pewne warunki. Wszystkie warunki są oparte na znacznikach, tzn. skok zostanie wykonany, gdy określone znaczniki będą miały określone wartości. 0, 1 – znacznik musi mieć jedną z tych wartości „-” – oznacza że wartość znacnika nie ma wpływu na wykonanie skoku Nazwa instrukcji (o tych samych warunkach) Znaczniki Dodatki CF ZF OF PF SF JE, JZ - 1 - - - Skok, gdy ZF = 1 JP, JPE - - - 1 - Skok, gdy PF = 1 JO - - 1 - - Skok, gdy OF = 1 JS - - - - 1 Skok, gdy SF = 1 JNE, JNZ - 0 - - - Skok, gdy ZF = 0 JNP, JPO - - - 0 - Skok, gdy PF = 0 JNO - - 0 - - Skok, gdy OF = 0 JB, JNAE, JC 1 - - - - Skok, gdy CF = 1 JNB, JAE, JN 0 - - - - Skok, gdy CF = 0 Instrukcje porównania CMP – to instrukcja porównująca dwa argumenty. CMP odejmuje od siebie argumenty i na tej podstawie ustawia znaczniki (wynik odejmowania nie jest nigdzie składowany). Składnia : CMP A, B Relacja Skok dla liczby bez znaku Skok dla liczby ze znakiem A=B JE JE A>B JA JG A<B JB JL A>=B JAE JGE A<= B JBE JLE AB JNE JNE Krok 1. Uruchamiamy Microsoft Visual Studio 2005 lub 2008. Otwieramy nowy projekt (menu-File-New-Project). Konfigurujemy jak na rys.1. Projekt umieszczamy Kontakt: [email protected] 2 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT w katalogu C:\users\inazwisko, gdzie nazwisko to pierwsza litera własnego imienia i nazwisko. Rys.1. Ustawienia przy tworzeniu nowego projektu Krok 2. Konfigurujemy wzorzec projektu tak jak na rys.2. (typu Single Document) Rys.2. Konfiguracja projektu Krok 3. Przykłady instrukcji warunkowej w asemblerze. Kompilujemy program wciskając przycisk F5 : Kontakt: [email protected] 3 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT Rys.3. Wstawka asemblerowa w Visual C++ komentarz: wstawkę asemblerową rozpoczynamy od słowa __asm, a ciąg instrukcji do wykonania pomiędzy klamrowymi nawiasami {}; Kolejny przykład zastosowania instrukcji warunkowej: /* przykladowy pseudokod if (a == 5) b = 2; else b = 1; */ unsigned char a, b; a = 5; //0x05 __asm { mov al, a add al, 0xfb ;0xfb = -5 jz et1 ; jeśli wynik operacji = 0, ZF=1 Kontakt: [email protected] 4 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT mov bl, 1 jmp koniec et1: mov bl, 2 koniec: mov b, bl } printf("Wartość b: %d", b); } /* przykladowy pseudokod if (a == 15) b = 2; else b = 1; */ unsigned char a, b; a = 15; //0x0f __asm { mov al, a xor al, 0x0f jz et1 ; jeśli wynik operacji = 0, ZF=1 mov bl, 1 jmp koniec et1: mov bl, 2 koniec: mov b, bl } printf("Wartość b: %d", b); } Krok 4. Operacja logiczna: AND , OR i XOR Instrukcja AND jest wygodna do maskowania argumentów np. ”polecenie wyzerować w ax bit numer n”. Stosuje się wówczas instrukcję AND z odpowiednią maską, w której bit n jest wyzerowane, a pozostałe są równe 1. Instrukcja AND wpływa na znaczniki np. ZF (znacznik zera) : 1 – gdy wynik operacji AND jest zerem, 0 – jeśli wynik jest różny od zera. Instrukcja OR jest wygodna do ustawiania bitów w argumencie, np. „polecenie ustawić w bx bity 2, 4, 6 nie zmieniając pozostałych”, to wykorzystujemy w operacji OR maskę, w której bity 2, 4 i 6 będą równe 1, natomiast pozostałe będą zerami. Instrukcja XOR jest wygodna do odwracania bitów, np. „polecenie odwrócenia/ zanegowania bitów 1, 2, 7 w rejestrze bx, nie zmieniając pozostałych bitów ” , to użyjemy w operacji XOR maski z ustawionymi (równymi 1) bitami 1, 2 i 7, a pozostałymi równymi zero. Instrukcja AND niszczy zawartość rejestru, oprócz interesujących nas bitów. W celu zachowaniu rejestru stosujemy instrukcję TEST. Działa ona identycznie jak AND, ale nie zapisuje wyniku działania. Po co nam więc taka instrukcja? Otóż, wynik nie jest zapisywany, ale TEST ustawia dla nas flagi identycznie jak AND. test al, 0x01 Kontakt: [email protected] 5 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT jz bit_1_byl_zerem ; jnz bit_1_nie_byl_zerem void main() { unsigned char a, b; a = 157; //0x9D, binarnie 1001 1101 __asm { xor al, al mov al, a and al, 0xfe ; wyzeruj b0 mov b, al ; b = 0x9C, binarnie 1001 1100 } printf("Wartość b: %d", b); // 156 } Rys.4. Działanie AND logicznego void main() { unsigned char a, b; a = 202; //0xCA, binarnie 1100 1010 __asm { xor al, al mov al, a or al, 0x11 ; wstaw 1 na b0 i b4 mov b, al ; b = 0xDB, binarnie 1101 1011 } printf("Wartość b: %d", b); // 219 } Rys.5. Działanie OR logicznego void main() { unsigned char a, b; a = 187; //0xBB, binarnie 1011 1011 __asm { xor al, al mov al, a printf("Wartość b: %d", b); // 154 } Rys.6. Działanie XOR logicznego Kontakt: [email protected] 6 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT … //zprawdzanie b0, parzystość/nieparzystość liczby unsigned char a, wynik; a = 14; __asm { xor al, al mov al, a test al, 0x01 jz et1 mov ah, 1 jmp koniec ; w al = 0000 1110 ; 0000 0001 <-maska ; b0 jest równy 0 czyli operacja = 0 to ZF =1 ; w przeciwnym wypadku et1: mov ah, 0 jmp koniec koniec: mov wynik, ah } printf("Wartość b: %d", wynik); } Rys.7. Działanie instrukcji TEST – sprawdzanie parzystości liczby Krok 5. Proszę przepisać i dokonać analizy kodu z kroku 3 oraz 4 z wykorzystaniem narzędzia Debugera Krok 6. Możemy użyć instrukcji warunkowe do realizacji pętli. void main() { unsigned char a, b; __asm { mov al, 0xff ; definiujemy liczbę iteracji pętli skok: dec al jnz skok ; zmniejszamy licznik pętli ; wykonaj skok jeśli licznik nie jest zerowy } Krok 7. Przesunięcia bitowe : Rys.8. Działanie SHL i SHR Kontakt: [email protected] 7 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT SHL – przesunięcia bitowe w lewo o zadaną liczbę miejsc SHR – przesunięcia bitowe w prawo o zadaną liczbę miejsc. Krok 8. Dana jest liczba ośmiobitowa b (b7b6b5b4b3b2b1b0). Ustaw bity wg następnej kolejności b6b7b4b5b2b3b0b1. Krok 9. Dana jest dowolna liczba ośmiobitowa, Znajdź liczbę jedynek. Opracowanie na podstawie: Asembler. Miniprzewodnik. Grzegorz Michałek. Kontakt: [email protected] 8