Ćwiczenie nr 11: Assembler

Transkrypt

Ćwiczenie nr 11: Assembler
Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego
Barbara Łukawska, Adam Krechowicz, Tomasz Michno
Ćwiczenie nr 11: Assembler
Procesory rodziny x86 są najczęściej uŜywanymi procesorami w komputerach PC.
NajwaŜniejsze elementy architektury procesora x86 zostały przedstawione na rysunku poniŜej:
ALU
Układ
adresowania
Rejestry
Znaczniki
Układ sterujący
Jednym z najwaŜniejszych elementów procesora jest jednostka arytmetyczno – logiczna
(ALU). Odpowiada ona za realizowanie operacji takich jak dodawanie czy odejmowanie.
Znaczniki odpowiadają za przechowywanie aktualnego stanu procesora i wykorzystywane są
np. do sterowania przebiegiem programu.
Rejestry zawierają komórki pamięci, na których wykonywane są operacje. Do najwaŜniejszych
rejestrów naleŜą:
•
AX – akumulator. Wykorzystywany najczęściej do operacji arytmetycznych. Jest to
rejestr 16 bitowy składający się z dwóch rejestrów 8 bitowych AH i AL.
•
BX – rejestr bazowy. Jest to rejestr 16 bitowy składający się z dwóch rejestrów 8
bitowych BH i BL.
•
CX – rejestr licznikowy. Jest to rejestr 16 bitowy składający się z dwóch rejestrów 8
bitowych CH i CL.
•
DX – rejestr danych. Jest to rejestr 16 bitowy składający się z dwóch rejestrów 8
bitowych DH i DL.
KaŜdy program, napisany w języku wysokiego poziomu, aby mógł być wykonany, musi zostać
przetworzony na ciąg instrukcji procesora. Proces ten nazwany jest kompilacją.
KaŜdy procesor posiada swój zestaw instrukcji, które są wykorzystywane do tworzenia
programów. Instrukcje te moŜna takŜe wykorzystać do samodzielnego pisania programów na
niskim poziomie. SłuŜy do tego język zwany asemblerem i zawiera instrukcje, które są
bezpośrednio odwzorowane na instrukcje procesora.
Projekt ,,Absolwent Politechniki Świętokrzyskiej – inŜynier na miarę potrzeb współczesnej gospodarki’’
Program Operacyjny Kapitał Ludzki Priorytet IV Działanie 4.1, Poddziałanie 4.1.2
umowa UDA – POKL.04.01.02-00-213/12-00
Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego
Do umieszczenia fragmentów programów asemblerowych w Turbo Pascalu wykorzystuje się
blok:
asm
end;
PoniŜej znajduje się wykaz niektórych instrukcji asemblera procesora x86, które moŜna uŜyć w
swoich programach:
•
mov a, b – ustawienie rejestrowi, zmiennej, lub komórce pamięci określonej przez
pierwszy argument wartości z drugiego argumentu. Np. mov ah, 5 spowoduje
przypisanie do rejestru ah wartości 5
•
add a, b – dodanie podanych wartości, wynik zostanie zapisany w argumencie a
•
sub a, b – odejmowanie podanych wartości
•
and a, b – wykonanie logicznego AND
•
or a, b – wykonanie logicznego OR
•
not a – wykonanie logicznego NOT
•
inc a – zwiększenie o 1
•
dec a – zmniejszenie o 1
•
jmp @miejsce – bezwarunkowy skok w podane miejsce
•
cmp a, b – porównanie dwóch liczb. Po tej instrukcji moŜe występować instrukcja
skoku realizowana w zaleŜności od wyniku operacji:
o ja @miejsce – skok w podane miejsce, jeśli większe
o jae @ miejsce – skok w podane miejsce, jeśli większe lub równe
o jb @miejsce – skok w podane miejsce, jeśli mniejsze
o jbe @miejsce – skok w podane miejsce, jeśli mniejsze lub równe
o jz @ miejsce – skok w podane miejsce, jeśli poprzednia operacja zwróciła 0
o jnz @miejsce – skok w podane miejsce, jeśli poprzednia operacja zwróciła
liczbę róŜną od 0
o js @ miejsce – skok w podane miejsce, jeśli poprzednia operacja zwróciła liczbę
ujemną
Projekt ,,Absolwent Politechniki Świętokrzyskiej – inŜynier na miarę potrzeb współczesnej gospodarki’’
Program Operacyjny Kapitał Ludzki Priorytet IV Działanie 4.1, Poddziałanie 4.1.2
umowa UDA – POKL.04.01.02-00-213/12-00
Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego
o jns @miejsce – skok w podane miejsce, jeśli poprzednia operacja zwróciła
liczbę dodatnią
Przykład:
program asmtest;
var
x: byte;
y: byte;
begin
Readln(x);
Readln(y);
asm
mov ah, y
add x, ah
cmp x, 10
jbe @koniec
mov x, 10
@koniec:
end;
Writeln(x);
Readln;
end.
PowyŜszy program zapisuje do rejestru ah wartość przechowywaną w zmiennej y. Następnie
wykonywane jest dodawanie wartości ah do zmiennej x. Kolejne instrukcje odpowiadają za
warunek. Jeśli wartość sumy (znajdującej się w x) jest mniejsza od 10 następuje skok na koniec
programu zaznaczonego etykietą @koniec. W przeciwnym wypadku do zmiennej x zapisywana
jest wartość 10.
Projekt ,,Absolwent Politechniki Świętokrzyskiej – inŜynier na miarę potrzeb współczesnej gospodarki’’
Program Operacyjny Kapitał Ludzki Priorytet IV Działanie 4.1, Poddziałanie 4.1.2
umowa UDA – POKL.04.01.02-00-213/12-00
Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego
Zadania do wykonania:
1. Napisz program realizujący obliczenia w formie wstawki języka asembler:
a) Sumujący trzy podane liczby
b) Obliczający x*4 wykorzystując dodawanie
c) Wykonujący obliczenia (x – 2) + y
d) Jeśli x > 5 to (x+10)-(x+2) w przeciwnym wypadku x+(x-1)
e) Jeśli w x jest ustawiony czwarty bit oblicz x + 2 w przeciwnym wypadku x + 3
f) Ustaw w x piąty bit na 1 następnie wyzeruj bity 7 i 8
g) Jeśli x > 4 i y < 5 oblicz x+y w przeciwnym wypadku przypisz x = y = 0
h) Dopóki x > 0 wykonaj x = x-1
i) Oblicz resztę z dzielenia dwóch liczb wykorzystując odejmowanie
j) Oblicz x*y wykorzystując dodawanie
Projekt ,,Absolwent Politechniki Świętokrzyskiej – inŜynier na miarę potrzeb współczesnej gospodarki’’
Program Operacyjny Kapitał Ludzki Priorytet IV Działanie 4.1, Poddziałanie 4.1.2
umowa UDA – POKL.04.01.02-00-213/12-00