You are on page 1of 50

Architektura komputerów

Programowanie w asemblerze
Operacje warunkowe

mgr inż. Janusz Magaj


j.magaj@pm.szczecin.pl
Tematy
1. Wstęp do architektury komputerów
2. Architektura procesora
3. Reprezentacja i arytmetyka liczb całkowitych w procesorze
4. Reprezentacja i arytmetyka liczb zmiennoprzecinkowych w procesorze
5. Programowanie w asemblerze

1. Wstęp - asembler
2. Operacje przypisania, operacje arytmetyczne
3. Operacje warunkowe
4. Pętle programowe
5. Tablice, wskaźniki
6. Stos, Funkcje, wywołanie funkcji

6. Budowa komputera PC
Literatura
• Farbaniec D., Asembler Programowanie, Helion, 2019
• Wróbel E., Praktyczny kurs ASEMBLERA, Helion, 2011
• Kruk S., Asembler Wykłady i ćwiczenia, WN PWN, 2009
• Pirogow V., Asembler. Podręcznik programisty, Helion, 2005
• Irvine K.R., Asembler dla procesorów Intel. Vademecum profesjonalisty, Helion, 2003
• Materiały firmowe – INTEL, AMD, Apple, Qualcomm
Materiały firmowe:
Instrukcja warunkowa
Instrukcja warunkowa – element języka programowania, który pozwala
na wykonanie różnych instrukcji w zależności od tego czy zdefiniowane
przez programistę wyrażenie logiczne jest prawdziwe, czy fałszywe.
Instrukcja warunkowa - rodzaje

If-Then Jest spotykany w większości języków programowania i umożliwia


warunkowe wykonanie określonego bloku kodu, a jeśli warunek nie jest
spełniony – alternatywnego bloku.
Instrukcja warunkowa - rodzaje
If-Then
else-if

Wiele języków programowania umożliwia zdefiniowanie więcej niż jednego


warunku do sprawdzenia przy pomocy opcjonalnego bloku else-if
Instrukcja warunkowa - warunek
W asemblerze, wynik porównania jest przechowywany w rejestrze
FLAGS dla późniejszego użycia.
➢ 80x86 dostarcza instrukcji CMP dla wykonania porównania.
➢ Rejestr FLAGS jest ustawiany w oparciu o różnicę dwóch operandów
instrukcji CMP. Operandy są odejmowane a rejestr FLAGS jest ustawiany
w oparciu o wynik, ale wynik nie jest nigdzie przechowywany. Jeśli chcemy
użyć wyniku stosujemy instrukcję SUB zamiast CMP
Instrukcja warunkowa - warunek
W asemblerze, wynik porównania jest przechowywany w rejestrze
FLAGS dla późniejszego użycia.
8080

0 CY (carry) – przeniesienie – bit jest ustawiany, gdy na najstarszym bicie wyniku operacji wystąpiło przeniesienie
lub pożyczka,
1 Stała wartość 1,
2 P (parity) – parzystość – bit jest ustawiany, gdy bitowy zapis wyniku posiada parzystą ilość jedynek,
3 Stała wartość 0,
4 AC (auxillary carry) – przeniesienie połówkowe - bit jest ustawiany, gdy wystąpi pożyczka lub przeniesienie
między bitem trzecim i czwartym wyniku,
5 Stała wartość 0,
6 Z (zero) – bit jest ustawiany, gdy wynik jest równy 0,
7 S (sign) – znak – bit jest ustawiany gdy najstarszy bit wyniku ma wartość 1.
Flagi - przykłady
0 CY (carry) – przeniesienie – bit jest ustawiany, gdy na najstarszym bicie wyniku operacji wystąpiło przeniesienie
lub pożyczka,

1010 1110
+0111 0100

10010 0010
CY=1

2 P (parity) – parzystość – bit jest ustawiany, gdy bitowy zapis wyniku posiada parzystą ilość jedynek,
Flagi - przykłady
4 AC (auxillary carry) – przeniesienie połówkowe - bit jest ustawiany, gdy wystąpi pożyczka lub przeniesienie między
bitem trzecim i czwartym wyniku,

0010 1110
+0110 0100

1001 0010
AF=1
Flagi - przykłady
6 Z (zero) – bit jest ustawiany, gdy wynik jest równy 0,

1111 1111
+0000 0001

0000 0000
ZF=1
Flagi - przykłady
7 S (sign) – znak – bit jest ustawiany gdy najstarszy bit wyniku ma wartość 1.

0110 0000
+0100 0001

1010 0001
SF=1
Rejestr flag - FLAGS
FLAGS – rejestr procesorów zgodnych z architekturą x86 zaprojektowaną przez
Intela w latach 70. XX wieku i modernizowaną do tej pory, na której opiera się
zdecydowana większość współczesnych komputerów osobistych.
Nazwa FLAGS dotyczy zwykle 16-bitowego rejestru stanu procesorów do 80286 włącznie.

8086
Rejestr flag - FLAGS
➢ W architekturze IA-32 (od 80386 do najnowszych 32-bitowych procesorów firmy Intel) rejestr ten
jest 32-bitowy i nosi nazwę EFLAGS.
➢ W procesorach o architekturze 64-bitowej, zgodnej z x86 (x86-64, EM64T) rejestr stanu ma długość
64 bitów, przy czym opisuje się go symbolem RFLAGS.

Poszczególne rodzaje rejestrów są


ze sobą zgodne
Rejestr flag - FLAGS
➢ Wykonanie niektórych instrukcji może zmienić wartości w rejestrze flag
Rejestr flag - FLAGS
➢ Wykonanie niektórych instrukcji może zmienić wartości w rejestrze flag

Instrukcja dodawania całkowitego


Instrukcja skoku
➢ Wykorzystując ustawienia flag można wykonać instrukcje skoku

jc etykieta
skok jak wystąpiło przeniesienie
Instrukcja warunkowa - warunek
Przykład:
Przykład 100+100 = ?

AL= C816=20010
Przykład 200+100 = ?

2C16 -> 4410


Instrukcja warunkowa - warunek
W wyrażeniach logicznych mogą występować różne operatory logiczne
AND, OR lub NOT
Instrukcja logiczna
operator logiczny AND

działanie: wykonuje operację AND (koniunkcja) na odpowiadających sobie bitach operandów A i B;


wynik jest przechowywany w A (poprzednia wartość zostaje zamazana).

A: rejestr lub adres pamięci.


B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci).
modyfikowane flagi: OF i CF są zerowane; SF, ZF i PF nabywają wartość zależną od wyniku.

przykład: and edx, ebx


Instrukcja logiczna
operator negacji NEG
działanie: wykonuje działanie 0-A (odwraca znak liczby) i wynik przechowuje w A. Inna nazwa tej
operacji to uzupełnienie dwójkowe. Polega to na zanegowaniu danej liczby i dodaniu jeden.
Odwrócenie procesu polega na wykonaniu tej samej czynności

A: rejestr lub adres pamięci.

przykład:
neg edx
neg al
Instrukcja logiczna
operator logiczny NOT
działanie: neguje (odwraca) wartości wszystkich bitów w A (1->0; 0->1).
W literaturze instrukcja ta zwana jest także uzupełnieniem jedynkowym

A: rejestr lub adres pamięci.

przykłady:
not edx
not al
Instrukcja logiczna
operator logiczny AND

działanie: wykonuje operację AND (koniunkcja) na odpowiadających sobie bitach operandów A i B;


wynik jest przechowywany w A (poprzednia wartość zostaje zamazana).

A: rejestr lub adres pamięci.


B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci).
modyfikowane flagi: OF i CF są zerowane; SF, ZF i PF nabywają wartość zależną od wyniku.

przykład: and edx, ebx


Instrukcja logiczna
operator logiczny AND
przykład: and al, bl
Instrukcja logiczna
operator logiczny OR

działanie: wykonuje operację OR (alternatywa) na odpowiadających sobie bitach operandów A i B;


wynik jest przechowywany w A (poprzednia wartość zostaje zamazana).

A: rejestr lub adres pamięci.


B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem
pamięci).
modyfikowane flagi: OF i CF są zerowane; SF, ZF i PF nabywają wartość zależną od wyniku.

przykład: or edx,ebx
Instrukcja logiczna
operator logiczny OR
przykład: or al, bl
Instrukcja logiczna
operator logiczny XOR

działanie: wykonuje operację XOR (alternatywa wykluczająca) na odpowiadających sobie bitach A i B;


wynik jest przechowywany w A (poprzednia wartość zostaje zamazana).

A: rejestr lub adres pamięci.


B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci).
modyfikowane flagi: OF i CF są zerowane; SF, ZF i PF nabywają wartość zależną od wyniku.

przykład: xor edx, ebx


Instrukcja logiczna
operator logiczny XOR
przykład: xor al bl
Instrukcja logiczna
operator logiczny TEST
działanie: wykonuje operację AND (koniunkcja) na odpowiadających sobie bitach operandów A i B;
działa podobnie jak instrukcja and, jednak nie zapisuje nigdzie wyniku operacji.
Ustawia jedynie stosowne flagi, w sposób identyczny w jaki robi to instrukcja and.

A: rejestr lub adres pamięci.


B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci).
modyfikowane flagi: OF i CF są zerowane; SF, ZF i PF nabywają wartość zależną od wyniku; stan
AF staje się niezdefiniowany.

przykład: test edx, ebx


Instrukcja logiczna
operator logiczny TEST

przykład: test al, bl


Instrukcja logiczna
operator logiczny SHL – przesunięcie logiczne w lewo

działanie: przesuwa wszystkie bity A w lewo o ilość bitów zdefiniowaną przez B

A: rejestr lub adres pamięci.


B: konkretna wartość lub rejestr CL (8-bitowa część rejestru ECX).
modyfikowane flagi: CF (przyjmuje wartość ostatniego bitu "wyrzuconego" poza obręb); SF, ZF
i PF (zależnie od wyniku), OF(tylko, gdy B=1; przyjmuje wartość 0, gdy dwa ostatnie bity przed
przesunięciem były równe; przyjmuje 1 w przeciwnym przypadku).

przykład: shl edx, 02h


Instrukcja logiczna
operator logiczny SHL – przesunięcie logiczne w lewo
Instrukcja logiczna
operator logiczny SHR – przesunięcie logiczne w prawo
działanie: przesuwa wszystkie bity A w prawo o ilość bitów zdefiniowaną przez B

A: rejestr lub adres pamięci.


B: konkretna wartość lub rejestr CL (8-bitowa część rejestru ECX).
modyfikowane flagi: CF (przyjmuje wartość ostatniego bitu "wyrzuconego" poza obręb); SF,
ZF i PF (zależnie od wyniku), OF(tylko, gdy B=1; przyjmuje wartość ostatniego bitu A przed
przesunięciem).

przykład: shr edx, 02h


Instrukcja logiczna
operator logiczny SHR – przesunięcie logiczne w prawo
Instrukcje skoku – asembler
▪ Skok bezwarunkowy JMP
▪ Skoki warunkowe JZ,JNZ,…
(wykonywane gdy spełniony jest określony warunek)

▪ Wywołanie procedury/funkcji CALL


▪ Powrót z procedury/funkcji RET
ang. return from interrupt
Instrukcje skoku – JMP
jmp etykieta
polecenie wykonuje bezwarunkowy skok do etykiety lub adresu.

Etykieta może być typu


short (-128 lub 127 bajtów od aktualnego położenia),
near (aktualny segment) lub
far (inny segment).
Instrukcje skoku warunkowego
jz etykieta Jump if Zero
polecenie wykonuje skok do etykiety lub adresu jeżeli flaga ZF=1.
Pętle programowe – asembler – pętla FOR
Instrukcja skoku jmp
Pętle programowe – asembler – pętla FOR
Instrukcja skoku jmp
Pętle programowe – asembler – pętla FOR
Instrukcja skoku jmp
Pętle programowe – asembler
start
Pętla FOR
i=7, j=9

AX=0
CX=j
start
Nie
CX=0
ADD AX , i
Tak

SUB CX,1
koniec

wyświetl k

stop
Pętle programowe – asembler
start
Pętla FOR
i=7, j=9

AX=0
CX=j
start
Nie
CX=0
ADD AX , i
Tak

SUB CX,1
koniec

wyświetl k

stop
Pętle programowe – asembler
Instrukcja skoku LOOP
pętla; zmniejsza wartość rejestru CX o jeden i jeśli CX jest większe od 0, to
powoduje bezwarunkowy przeskok do etykiety
loop etykieta
Pętle programowe – asembler
Instrukcja skoku LOOP

suma=55
Pętle programowe – asembler
Instrukcja skoku – wariantowa LOOPZ, LOOPNZ

LOOPE, LOOPNE, LOOPZ, LOOPNZ działają następująco :


▪ zmniejsza CX o jeden (DEC CX - tak jak przy LOOP)
▪ jeśli CX>0 wykonuje skok warunkowy do etykiety w zależności od typu
instrukcji: LOOPE - JE, LOOPNE - JNE, LOOPZ - JZ, LOOPNZ - JNZ.
▪ jeśli CX=0 lub nie spełniono warunku skoku warunkowego, to zakańcza pętlę
Pętle programowe – asembler
Instrukcja skoku – wariantowa LOOPZ, LOOPNZ
Dziękuję za uwagę

You might also like