background image

Wykład 7

Struktury danych

Konstrukcje warunkowe

background image

Definiowanie symboli

Zmienne programu

Struktury zło

Ŝ

one

Sterowanie programem

Skoki warunkowe

Warunkowe polecenia blokowe

background image

Definicje symboli

Etykiety

przy instrukcjach lub polach danych

Warto

ś

ci

ą

etykiety jest adres przypisany linii programu 

ASM

Stałe

symbol

EQU

warto

ść

< warto

ść

> ::= <stała > | <inny symbol> | <wyra

Ŝ

enie>

Zwi

ę

ksza czytelno

ść

i zrozumiało

ść

programu

definiowanie uprzednie (niemo

Ŝ

liwe odwołania w przód)

background image

Definiowanie symboli

Przykład 1

MAXLEN

EQU

4096

MOV

EX,#MAXLEN

Przykład 2 (def. wielu rejestrów uniwersalnych)

BASE

EQU

R1

COUNT EQU

R2

INDEX EQU  R3

Przykład 3

MAXLEN

EQU

BUFEND-BUFFER

background image

Symbole lokalne

dyrektywa QUAL:

QUAL symbol

ASM poprzedza ka

Ŝ

dy kolejny 

symbol przedrostkiem 
/<symbol>/

Nie wyst

ę

puje 

w MASM 86

background image

Definiowanie zmiennych programu

Rezerwacja komórek pami

ę

ci na zmienne programu

- zmienne z warto

ś

ci

ą

 zainicjalizowan

ą

- zmienne bez zainicjalizowanej warto

ś

ci

Np. dyrektywy:

DB, DW, DQ, DT

Dyrektywa DB:

symbol

DB wyra

Ŝ

enie, [wyra

Ŝ

enie],

Lista odpowiadaj

ą

ca zainicjalizowanym warto

ś

ciom. 

Zwykle „?”

oznacza warto

ść

 dowoln

ą

background image

Definiowanie zmiennych programu

Przykład 1

Przykład 3

ę

dnie!!!

Zostanie 

potraktowane jak kod instrukcji

Przykład 2

ENTRY

background image

Przypisanie adresu pocz

ą

tkowego

Dyrektywa ORG (origin):

ORG warto

ść

< warto

ść

> ::= <stała > | <inny 

symbol> | <wyra

Ŝ

enie>

Po

ś

rednio przypisuje 

warto

ś

ci symbolom

Ustawia wska

ź

nik 

lokalizacji kodu na 
wyspecyfikowan

ą

warto

ść

definiowanie uprzednie 
(niemo

Ŝ

liwe odwołania w 

przód)

background image

Przy u

Ŝ

yciu EQU

STAB

DB

1190 DUP (?)

SYMBOL

EQU

STAB

VALUE

EQU

STAB+6

FLAG

EQU

STAB+10

SYMBOL

VALUE FLAGS

STAB

6 bajtów

4 bajty 2 bajty

(100 pozycji)

.

.

.

.

.

.

.

.

.

Przy u

Ŝ

yciu ORG

STAB

DB

1190 DUP (?)

ORG

STAB

SYMBOL

DB

6 DUP (?)

VALUE

DW

?

FLAGS

DB

2 DUP (?)

ORG

STAB+1190

Przypisanie bloku do pami

ę

ci,

definiowanie tablic

Przykład

background image

Zło

Ŝ

one struktury zmiennych programu

Dyrektywa RECORD:

symbol

RECORD n_pola:długo

ść

 [wyra

Ŝ

enie], [n_pola:długo

ść

 

[wyra

Ŝ

enie]]

Definiuje struktur

ę

 o danej nazwie. 

Nie dokonuje alokacji

background image

Dyrektywa STRUCT:

symbol

STRUCT [alignment]

deklaracje pól

symbol

ENDS

Zło

Ŝ

one struktury zmiennych programu

Definiuje struktur

ę

 o danej 

nazwie. Nie dokonuje alokacji

Ustala „raster” lokalizacji w 

pami

ę

ci

background image

Konstrukcje warunkowe

background image

Flagi statusu – przypomnienie

Flaga

Zero

ustawiana, gdy wynik wynosi 0.

Flaga

Carry

ustawiana, gdy wynik jest zbyt du

Ŝ

y (zbyt mały), aby 

umie

ś

ci

ć

 w lokalizacji docelowej.

Flaga

Sign

ustawiana, gdy wynik jest ujemny.

Flaga

Overflow

ustawiana, gdy wynik w postaci liczby ze znakiem 

jest niewła

ś

ciwy.

Flaga

Parity

ustawiana, gdy wynik zawiera parzyst

ą

 liczb

ę

 1 (low 

byte).

Flaga

Auxiliary Carry

ustawiana, gdy przeniesienie z bitu 3 na bit 4

background image

Skoki warunkowe

Warunki odnosz

ą

 si

ę

 do. . .

- flag

- równo

ś

ci (argumentów)

- wyników porówna

ń

 (bez znaku)

- wyników porówna

ń

 (ze znakiem)

background image

Skoki warunkowe (od flag)

background image

Skoki warunkowe (równo

ść

/nierówno

ść

)

rejestr licznikowy

background image

Skoki warunkowe (porównania bez znaku)

CF=0 i ZF=0

CF=0 i ZF=0

CF=0

CF=0

CF=1

CF=1

CF=1 lub ZF=1

CF=1 lub ZF=1

background image

Skoki warunkowe (porównania ze znakiem)

SF=OF i ZF=0

SF=OF

SF

OF

SF

OF lub ZF=1

background image

Warunki rozgał

ę

zie

ń

mov ax,wordVal

and ax,1

; zeruj bity poza najmłodszym

jz  EvenValue

; skocz, gdy ustawiona flaga zera

• Zadanie: skocz do etykiety, je

Ŝ

eli liczba całk. parzysta.

• Rozwi

ą

zanie: wyzeruj wszystkie bity poza najmłodszym 

(x 

AND

1). Gdy rezultat 0 - liczba była parzysta.

• Zadanie: Skocz do etykiety, gdy zawarto

ść

 AL

0.

• Rozwi

ą

zanie: wykonaj AL 

OR

AL (0 

AL=0). U

Ŝ

yj JNZ 

(jump if not zero).

or  al,al

jnz IsNotZero

; skocz, gdy nie zero

Uwaga! x

x=x

background image

Warunki rozgał

ę

zie

ń

Zastosowanie instrukcji 

TEST

Nie modyfikuje operandów; okre

ś

la stan flagi „Zero”.

Warto

ść

 flagi „Zero” jak dla instrukcji AND

Przykład 1: skocz, gdy AL

0

lub AL

1

ustawione.

test al,00000011b

jnz  ValueFound

Przykład 2: skocz, gdy ani AL

0

ani AL

1

ustawione. 

test al,00000011b

jz   ValueNotFound

background image

Warunki rozgał

ę

zie

ń

Zastosowanie instrukcji 

CMP

Porównuje operand docelowy ze 

ź

ródłowym

Warto

ś

ci flag jak dla odejmowania operandu 

ź

ródłowego od 

operandu docelowego; operandy niezmienione.

Składnia: 

CMP arg docelowy, arg

ź

ródłowy

SF=¬OF

CF=1

docelowy < 

ź

ródłowy

SF=OF

ZF=0 

CF=0

docelowy > 

ź

ródłowy

ZF=1

docelowy 

ź

ródłowy

background image

Oprnd1

minus

Oprnd2

S

O

------

------

-

-

0FFFF (-1) 

-

0FFFE (-2) 

8000

-

00001 

FFFE (-2) 

-

0FFFF (-1) 

07FFF (32767)  -

0FFFF (-1) 

1

Warunki rozgał

ę

zie

ń

Zastosowanie instrukcji 

CMP

background image

Warunki rozgał

ę

zie

ń

cmp eax,ebx

ja

Larger

• Zadanie: skocz do etykiety, je

Ŝ

eli EAX>EBX (

bez znaku

)

• Rozwi

ą

zanie: u

Ŝ

yj 

CMP

, nast

ę

pnie 

JA

cmp eax,ebx

jg

Greater

• Zadanie: skocz do etykiety, je

Ŝ

eli EAX>EBX (

ze znakiem

)

• Rozwi

ą

zanie: u

Ŝ

yj 

CMP

, nast

ę

pnie 

JG

background image

Warunki rozgał

ę

zie

ń

cmp eax,Val1

jbe

L1

; mniejsze lub równe

• Skocz, je

Ŝ

eli EAX

Val1 (

bez znaku

)

cmp eax,Val1

jle

L1

; mniejsze lub równe

• Skocz, je

Ŝ

eli EAX

Val1 (

ze znakiem

)

background image

Warunki rozgał

ę

zie

ń

cmp 

WORD PTR [esi],

0

je

L1

• Skocz, je

Ŝ

eli słowo „adresowane” przez ESI równa si

ę

 0

test 

DWORD PTR [edi],

1

jz

L2

• Skocz, je

Ŝ

eli podwójne słowo „adresowane” przez EDI jest 

parzyste

background image

Warunki rozgał

ę

zie

ń

Warunki od warto

ś

ci bitu:

U

Ŝ

yj 

BT

do przekopiowania bitu do CF

Składnia: 

BT symbol, n

U

Ŝ

yj skoku od 

CF

Przykład: skocz, je

Ŝ

eli AX

9

=1:

bt

AX,9

; CF = bit 9

jc

L1

; skocz, gdy CF=1

r16, r32, lub imm8

r/m16 lub r/m32

background image

Organizacja p

ę

tli

Składnia: 

LOOP etykieta 

Działanie: 

ECX 

ECX – 1

ECX > 0, skok do etykiety

background image

Organizacja p

ę

tli

Składnia: 

LOOPE etykieta 

(

LOOPZ etykieta)

Działanie: 

ECX 

ECX – 1

ECX > 0 i ZF=1, skok do etykiety

Składnia: 

LOOPNE etykieta 

(

LOOPNZ etykieta)

Działanie: 

ECX 

ECX – 1

ECX > 0 i ZF=0, skok do etykiety

background image

Instrukcja do wykorzystania, nale

Ŝ

y powtarza

ć

 p

ę

tl

ę

 w czasie, gdy 

jedna warto

ść

=drugiej, lecz nie przekroczy

ć

 maksymalnej liczby iteracji

Organizacja p

ę

tli

LOOPE etykieta

Przykład: poszukiwanie pierwszego niezerowego elementu 
tablicy, w granicach tablicy:

mov cx, 16

;max 16 elementów

mov bx, -1 

;indeks w tablicy

SearchLp: 

inc bx 

;przesu

ń

 indeks

cmp Array[bx], 0 

;czy zero?

loope SearchLp 

;powtarzaj (zero, <16)

je AllZero 

;gdy wszystkie= zero

background image

Instrukcja do wykorzystania, gdy nale

Ŝ

y powtarza

ć

 p

ę

tl

ę

 maksymaln

ą

 

liczb

ę

 razy oczekuj

ą

c na spełnienie pewnego warunku

Organizacja p

ę

tli

LOOPNE etykieta

Przykład: oczekiwanie, a

Ŝ

 urz

ą

dzenie gotowe:

mov dx, 379h 

;adres portu

mov cx, 0 

;p

ę

tla max 65536 razy

WaitNotBusy:  in al, dx 

;czytaj port

test al, 80h 

;zaj

ę

ty?

loopne WaitNotBusy 

;gdy zaj

ę

ty i <65536x

jne TimedOut 

;skok, gdy „time out”(CX=0, ZF=0)

background image

Struktury warunkowe

Implementacja struktur warunkowych w ASM

• Blokowe polecenia IF

• P

ę

tle WHILE

• Przeł

ą

cznik CASE

Wsparcie makroasemblera (MASM)

• Polecenia blokowe IF

• P

ę

tle WHILE

• P

ę

tle REPEAT

background image

Blokowe polecenia IF

Odpowiedniki polece

ń

 j

ę

zyków wysokiego poziomu:

mov eax,op1

cmp eax,op2

jne L1

mov X,1

jmp L2

L1: mov X,2

L2:

if( op1 == op2 )

X = 1;

else

X = 2;

background image

Zło

Ŝ

one wyra

Ŝ

enia warunkowe

Wyra

Ŝ

enie warunkowe z iloczynem (AND)

Przykład: w poni

Ŝ

szym przykładzie HLL pomija wyznaczanie 

drugiego wyra

Ŝ

enia, je

Ŝ

eli pierwsze fałszywe. 

if (al > bl) AND (bl > cl)

X = 1;

background image

Zło

Ŝ

one wyra

Ŝ

enia warunkowe

if (al > bl) AND (bl > cl)

X = 1;

cmp al,bl

; pierwsze wyra

Ŝ

enie...

ja  L1

jmp next

L1:

cmp bl,cl

; drugie wyra

Ŝ

enie...

ja  L2

jmp next

L2:

; obydwa prawdziwe

mov X,1

; ustaw X na 1

next:

Jedna z mo

Ŝ

liwych implementacji: [IF 

(al > bl)

]

AND 

[IF

(bl > cl)

]

{

{

background image

Zło

Ŝ

one wyra

Ŝ

enia warunkowe

cmp al,bl

; pierwsze wyra

Ŝ

enie...

jbe next

; ko

ń

cz, gdy fałsz

cmp bl,cl

; drugie wyra

Ŝ

enie...

jbe next

; ko

ń

cz, gdy fałsz

mov X,1

; obydwa prawdziwe

next:

if (al > bl) AND (bl > cl)

X = 1;

Ale....poni

Ŝ

sza implementacja u

Ŝ

ywa prawie 30% kodu 

mniej: NOT {[IF NOT

(al > bl)

]

OR

[IF NOT 

(bl > cl)

]

}

background image

Zło

Ŝ

one wyra

Ŝ

enia warunkowe

Wyra

Ŝ

enie warunkowe z sum

ą

 logiczn

ą

 (OR)

Przykład: w poni

Ŝ

szym przykładzie HLL pomija wyznaczanie 

drugiego wyra

Ŝ

enia, je

Ŝ

eli pierwsze prawdziwe.

if (al > bl) OR (bl > cl)

X = 1;

background image

Zło

Ŝ

one wyra

Ŝ

enia warunkowe

cmp al,bl

; AL > BL?

ja  L1

; tak

cmp bl,cl

; nie: BL > CL?

jbe next

; nie: omi

ń

L1: mov X,1

; ustaw X na 1

next:

if (al > bl) OR (bl > cl)

X = 1;

Mo

Ŝ

na zastosowa

ć

 poprzedni

ą

 koncepcj

ę

 dla skrócenia 

programu:

background image

P

ę

tle WHILE

while( eax < ebx)

eax = eax + 1;

P

ę

tla

WHILE

jest w rzeczywisto

ś

ci poleceniem IF po którym 

nast

ę

puje tre

ść

 p

ę

tli zako

ń

czona skokiem bezwarunkowym 

na pocz

ą

tek p

ę

tli.

Przykład:

top: cmp eax,ebx

; sprawd

ź

 warunek p

ę

tli

jae next

; fałsz? Opu

ść

 p

ę

tl

ę

inc eax

; program p

ę

tli

jmp top

; powtarzaj p

ę

tl

ę

next:

Mo

Ŝ

liwa implementacja:

background image

CASE zmienna in 

"wzorzec1") polecenie1 ;; 
"wzorzec2") polecenie2 ;; 
"wzorzec3") polecenie3 ;;
*) polecenie_domy

ś

lne 

esac 

Przeł

ą

cznik CASE

Przeł

ą

cznik CASE

o nast

ę

puj

ą

cej składni:

... Porównuje zmienn

ą

 z wzorcami i po napotkaniu pierwszej 

zgodno

ś

ci wykonuje odpowiadaj

ą

ce polecenie a nast

ę

pnie 

ko

ń

czy CASE

background image

Przeł

ą

cznik - implementacja

.data

CaseTable BYTE 'A'

; warto

ść

 sprawdzana

DWORD Process_A

; adres procedury

EntrySize = ($ - CaseTable)

BYTE 'B'

DWORD Process_B

BYTE 'C'

DWORD Process_C

BYTE 'D'

DWORD Process_D

NumberOfEntries = ($ - CaseTable) / EntrySize

Krok 1: utwórz tablic

ę

 zawieraj

ą

c

ą

 wyró

Ŝ

niki i przesuni

ę

cia do 

procedur:

wyró

Ŝ

nik

adres

background image

Przeł

ą

cznik - implementacja

mov ebx,OFFSET CaseTable

; EBX wskazuje tablic

ę

mov ecx,NumberOfEntries

; licznik p

ę

tli

L1: cmp al,[ebx]

; znaleziono?

jne L2

; nie: kontynuuj

call NEAR PTR [ebx + 1]

; tak: wywołaj procedur

ę

jmp L3

; po zako

ń

czeniu opu

ść

 

p

ę

tl

ę

L2: add ebx,EntrySize

; przesu

ń

na nast.pozycj

ę

loop L1

; powtarzaj, a

Ŝ

 ECX = 0

L3:

Krok 2: U

Ŝ

yj p

ę

tli do przeszukiwania tablicy. Wywołaj procedur

ę

której przesuni

ę

cie wpisane w znalezionej pozycji:

wymagane dla 

wska

ź

ników do 

procedury

background image

Dyrektywy makroasemblera

.IF eax > ebx

mov edx,1

.ELSE

mov edx,2

.ENDIF

• Dyrektywy 

.IF, .ELSE, .ELSEIF, .ENDIF

mog

ą

 by

ć

 u

Ŝ

yte do 

utworzenia blokowych polece

ń

 IF.

• Przykłady:

• Makroasembler (MASM) utworzy „ukryty” kod 

ź

ródłowy 

składaj

ą

cy si

ę

 z instrukcji, etykiet, CMP i skoków 

warunkowych.

.IF eax > ebx && eax > ecx

mov edx,1

.ELSE

mov edx,2

.ENDIF

background image

U

Ŝ

ywane operatory logiczne i porówna

ń

background image

Ekwiwalentny kod ASM

mov eax,6

cmp eax,val1

jbe

@C0001 

mov result,1

@C0001:

.data

val1   DWORD 5

result DWORD ?

.code

mov eax,6

.IF eax > val1

mov result,1

.ENDIF

Odpowiadaj

ą

cy kod ASM:

MASM automatycznie stosuje 

JBE

(

bez znaku

), gdy

Ŝ

 val1 jest 

liczb

ą

 bez znaku

.

background image

mov eax,6

cmp eax,val1

jle

@C0001 

mov result,1

@C0001:

.data

val1   SDWORD 5

result SDWORD ?

.code

mov eax,6

.IF eax > val1

mov result,1

.ENDIF

Ekwiwalentny kod ASM

Odpowiadaj

ą

cy kod ASM:

MASM automatycznie stosuje 

JLE

(

ze znakiem

), gdy

Ŝ

 val1 jest 

liczb

ą

 ze znakiem

.

background image

mov ebx,5

mov eax,6

cmp eax,ebx

jbe

@C0001 

mov result,1

@C0001:

.data

result DWORD ?

.code

mov ebx,5

mov eax,6

.IF eax > ebx

mov result,1

.ENDIF

MASM automatycznie stosuje 

JBE

(

bez znaku

), gdy

Ŝ

 obydwa 

operandy 

s

ą

 rejestrami

Ekwiwalentny kod ASM

Odpowiadaj

ą

cy kod ASM:

background image

mov ebx,5

mov eax,6

cmp eax,ebx

jle

@C0001 

mov result,1

@C0001:

.data

result SDWORD ?

.code

mov ebx,5

mov eax,6

.IF SDWORD PTR eax > ebx

mov result,1

.ENDIF

. . .chyba, 

Ŝ

e operand rejestrowy zostanie poprzedzony 

prefiksem w postaci 

operatora SDWORD PTR

. Wówczas 

u

Ŝ

ywany jest skok 

JLE

(

ze znakiem

).

Ekwiwalentny kod ASM

Odpowiadaj

ą

cy kod ASM:

background image

Dyrektywa .REPEAT

; Display integers 1 – 10:

mov eax,0

.REPEAT

inc eax

call WriteDec

call Crlf

.UNTIL eax == 10

Program p

ę

tli jest wykonywany 

przed sprawdzeniem

warunku 

p

ę

tli, umieszczonego po dyrektywie .UNTIL. 

Przykład:

background image

Dyrektywa .REPEAT

Ekwiwalentny kod ASM

implementacja:

; Display integers 1 – 10:

mov eax,0

@C0001:

inc eax

call WriteDec

call Crlf

cmp eax,10

; sprawd

ź

 warunek p

ę

tli

jb @C0001

; fałsz? Opu

ść

 p

ę

tl

ę

background image

Dyrektywa .WHILE

; Display integers 1 – 10:

mov eax,0

.WHILE eax < 10

inc eax

call WriteDec

call Crlf

.ENDW

Warunek p

ę

tli sprawdzany jest 

przed wykonaniem programu

p

ę

tli. Koniec p

ę

tli oznaczony jest dyrektyw

ą

.ENDW. 

Przykład:

background image

Dyrektywa .WHILE

; Display integers 1 – 10:

mov eax,0

cmp eax,10

; sprawd

ź

 warunek p

ę

tli

jae @C0001

; fałsz? Opu

ść

 p

ę

tl

ę

inc eax

call WriteDec

call Crlf

@C0001:

Ekwiwalentny kod ASM

implementacja: