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