Wykład 8
Struktury danych
Konstrukcje warunkowe
•
Definiowanie symboli
•
Zmienne programu
•
Struktury zło
ż
one
•
Sterowanie programem
•
Skoki warunkowe
•
Warunkowe polecenia blokowe
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)
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
Symbole lokalne
dyrektywa QUAL:
QUAL symbol
ASM poprzedza ka
ż
dy kolejny
symbol przedrostkiem
/<symbol>/
Nie wyst
ę
puje
w MASM 86
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
ą
Definiowanie zmiennych programu
Przykład 1
Przykład 3
Bł
ę
dnie!!!
Zostanie
potraktowane jak kod instrukcji
Przykład 2
ENTRY
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)
•
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
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
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
Konstrukcje warunkowe
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
Skoki warunkowe
•
Warunki odnosz
ą
si
ę
do. . .
•
- flag
•
- równo
ś
ci (argumentów)
•
- wyników porówna
ń
(bez znaku)
•
- wyników porówna
ń
(ze znakiem)
Skoki warunkowe (od flag)
Skoki warunkowe (równo
ść
/nierówno
ść
)
rejestr licznikowy
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
Skoki warunkowe (porównania ze znakiem)
SF=OF i ZF=0
SF=OF
SF
≠
OF
SF
≠
OF lub ZF=1
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
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
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
Oprnd1
minus
Oprnd2
S
O
------
------
-
-
0FFFF (-1)
-
0FFFE (-2)
0
0
8000
-
00001
0
1
FFFE (-2)
-
0FFFF (-1)
1
0
07FFF (32767) -
0FFFF (-1)
1
1
Warunki rozgał
ę
zie
ń
•
Zastosowanie instrukcji
CMP
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
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
)
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
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
Organizacja p
ę
tli
•
Składnia:
LOOP etykieta
Działanie:
•
ECX
←
ECX – 1
•
ECX > 0, skok do etykiety
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
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
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)
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
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;
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;
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)
]
{
{
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)
]
}
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;
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:
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:
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
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
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
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
U
ż
ywane operatory logiczne i porówna
ń
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
.
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
.
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:
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:
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:
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
ę
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:
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: