Download - Assembly - String És Tömb Kezelés
AssemblyString és tömb kezelés
Iványi Péter
String műveletek• A string vagy szöveg „objektumok” halmaza
melyeket folytonosan memóriában tárolunk• Byte-ok, szavak és dupla szavak sorozata• A 80x86-os processzoroknak külön utasításaik
vannak ezek kezelésére
String műveletek• 5 különböző művelet
– MOVSx– CMPSx– SCASx– LODSx– STOSx
• ahol x– B, W, D
• Például: MOVSB, MOVSW, MOVSD
String műveletek működése• A műveletek egy memória blokkon működnek• Általában 3 dolog kell a működéshez
– Forrás blokk címe: DS:SI– Cél blokk címe: ES:DI– (opcionálisan) elemszám
• Az utasításnak nincsennek közvetlen operandusai• Alábbi regisztereket használják:
– SI, DI, CX, AL vagy AX, státusz bitek
Ismétlő prefix• Utasítások önmagukban csak egy adatot
mozgatnak, a CX regisztert nem használják• Ismétlő prefix-et kell használni
– Csak ezekkel az utasításokkal lehet használni!!!• Példa:
REP, REPE, REPZ, REPNE, REPNZ
REP MOVSB
Ismétlő prefix, REP1. Ha CX == 0000 akkor kilépés2. A prefix utáni utasítás egyszeri végrehajtása3. CX csökkentése 1-el4. Ugrás az 1. lépésre
Elöltesztelő ciklus, ha CX zérus semmi sem történik
Ismétlő prefix, REPE, REPZ1. Ha CX == 0000 akkor kilépés2. A prefix utáni utasítás egyszeri végrehajtása3. CX csökkentése 1-el4. Ha ZF = 0 akkor kilépés5. Ugrás az 1. lépésre
• Utasítás addig folytatódik amíg – CX nem zérus és – ZF = 1
Direction bit• Irány bit• Ha a direction bit == 0 akkor
minden műveletnél az SI és a DI növekszik• Ha a direction bit == 1 akkor
minden műveletnél az SI és a DI csökken
• CLD - direction bit törlése• STD - direction bit beállítása
Direction bitcld...call fvg... ; cld-t várjuk, de std lesz
fvg:std; string műveletret
Direction bitcld...call fvg... ; státusz bitek rendben
fvg:pushf ; státusz bitek elmentésestd; string műveletpopfret ; státusz bitek visszaállítása
MOVSB• Move string, byte
– Adat átmozgatás• Veszi az DS:SI által megcímzett byte-ot, szót,
dupla szót és átmásolja a ES:DI által címzett helyre
• SI és DI regisztert növeli vagy csökkenti• Ha REP is adva van, ellenőrzi CX tartalmát és ha
nem zérus akkor csökkenti CX tartalmát és újra átmásol egy adatot
MOVSB, példacldlea si, array1lea di, array2mov cx, 321rep movsb...
array1 repb 321array2 repb 321
MOVSW, példacldlea si, array1lea di, array2mov cx, 321 ; elemek száma, nem a byterep movsw...
array1 repw 321array2 repw 321
MOVSB, mi történikcldlea si, array1lea di, array2mov cx, 321rep movsb...
array1 db 0array2 repb 321
MOVSB, mi történik• A két tömb át van lapolva• Az array1 utolsó 320 eleme megegyezik az array2
első 320 elemével• Műveletek:
– SI-ből DI-be másol egy byte-ot– Megnöveli SI és DI értékét, csökkenti CX értékét– SI=array1+1 -ből DI=array2+1 -be másol, de array+1
-be az előbb másoltunk– és így tovább
MOVSB, mi történikX A B C D E F G H I J1. művelet
X X B C D E F G H I J2. művelet
X X X C D E F G H I J3. művelet
X X X X D E F G H I J4. művelet
MOVSB, mi történikX X X X X E F G H I J5. művelet
X X X X X X F G H I J6. művelet
...
X X X X X X X X X X Jn. művelet
Az ‘X’ értéket másoljuk mindenhova
MOVSB még egyszer• Átlapolt tömbök esetén hátulról kell másolni
X A B C D E F G H I J
X A B C D E F G H I I
X A B C D E F G H H I
X A B C D E F G G H I
...
MOVSx megjegyzések• Átlapolásnál figyelni kell az irányra• Ha nincsennek átlapolva, az irány mindegy• Tömb feltöltése egy értékkel
– Ne a MOVSx utasítást használjuk, van STOSx utasítás• A MOVSx hatékonyabb ha szavakat másolunk és
még hatékonyabb ha dupla szavakt másolunk
MOVSx példa 1.• 4099 byte másolása
cldlea si, forraslea di, celmov cx, 1024 ; 4096 byterep movsdmovsw ; 2 bytemovsb ; 1 byte...
MOVSx példa 2.• Nem ismerjük előre a másolandó méretet
cldlea si, forraslea di, celmov cx, meretshr cx, 2 ; osztás 4-eljz kevesebb_mint_4rep movsd
kevesebb_mint_4:mov cx, meretand cx, 11b ; maszkolás, 0-3 lehetjz vegerep movsb
vege:
CMPSx• Összehasonlítás
– Az SI által címzett adatból kivonja a DI által címzett adatot
– Frissíti a státusz biteket– Csökkenti vagy növeli SI és DI értékét
• Igazi haszna akkor van ha többször végezzük el az összehasonlítást– Az összehasonlítás addig tart amíg azonosak az adatok
és CX nem zérus:REPE
CMPSx, példacldlea si, s1lea di, s2mov cx, 7repe cmpsb... ; státusz bitek ellenőrzése
s1 db ’String1’s2 db ’String1’
Szövegek összehasonlításacldlea si, szoveg1lea di, szoveg2mov cx, forras_hosszacmp cx, cel_hosszajb hasonlitmov cx, cel_hossza ; rövidebb hossz CX-be
hasonlit:repe cmpsbjnz vege ; ha azonosak voltak, nézzük a hossztmov cx, forras_hosszacmp cx, cel_hossza
vege:
SCASx• Scan string
– Keresés• Csak cél memória blokkot kell megadni• A forrás AL (SCASB), AX (SCASW) vagy EAX
(SCASD) regiszter• REPE - keresés amíg egyenlő• REPNE - keresés amíg nem egyenlő
STOSx• Az accumulator regiszter által tárolt adatot tárolja
a cél memória blokkban• Például 256 byte törlése
cldlea di, tombmov cx, 64 ; 64 dupla szóxor ax, axrep stosd
LODSx• Egyedi utasítás• Szinte soha nem használjuk prefix-el• Az SI által címzet területen levő adatot tölti az
accumulator regiszterbe
LODSx példa• Minden karakterhez adjunk 1-et
cldmov si, tombmov di, simov cx, tomb_hossza
ismet:lodsbinc alstosbdec cxjnz ismet
Macro• Makró• Preprocesszor által kezelt egység• Olyan mint C-ben
#define pi 3.1415– A fordítás előtt dolgozzuk fel– A név helyébe a definiált kód kerül
Makró és függvény• Függvény:
– Utasítások gyüjteménye aminek átadjuk a vezérlést, majd amikor véget ért, akkor a vezérlést oda adjuk vissza ahonnan a függvényt meghívtuk
• Makró– Olyan utasítások sorozata amit egyszer írtunk le, majd
akárhányszor újra használhatunk– A kódrészlet kerül mindig beillesztésre
Makró és függvény• Nagyon hasonlóak• Fontos különbség, hogy a makrónak közvetlenül át
lehet adni paramétert, a függvénynek nem!!!• Másik különbség:
– Függvényt a CALL utasítással hívunk meg– Makrót mint egy assembler utasítást hívunk meg
Legegyszerűbb makró%define ctrl 0x1F &%define param(a,b) ((a)+(a)*(b))
mov byte [param(2,bx)], ctrl 'D‘
mov byte [(2)+(2)*(bx)], 0x1F & 'D'
Legegyszerűbb makró%define• Kis, nagybetű számít• Körkörös referenciát csak egyszer fejti
%define a(x) 1+a(x)mov ax,a(3) -> mov ax, 1+a(3)
• Kibontás használatkor történik nem definiáláskor%define a(x) 1+b(x)%define b(x) 2*x mov ax,a(8) -> mov ax,1+2*8
Több soros makró%macro BillVar 0
MOV AH,0INT 16H
%endmacro• Makró neve: BillVar• Nincs paramétere: 0• Hívás:
BillVar
Több soros makró%macro BillVar 0
MOV AH,0INT 16H
%endmacro%macro Kilep 0
INT 20H%endmacro
org 100hBillVar ; mint assembly utasításKilep
Több soros makró• Paraméterek száma a név után• Paraméterre a hivatkozás: %n
%macro bevezetes 1push ebp mov ebp,esp sub esp,%1
%endmacro
Több soros makrófvg: bevezetes 12
fvg: push ebp mov ebp,esp sub esp, 12
További paraméterek esetén: %2, %3
Több soros makró• Ha vesszőt is át akarunk adni, akkor kapcsos
zárójelek közé kell tenni
%macro silly 2%2: db %1 %endmacro
silly 'a', letter_a ; letter_a: db 'a' silly 'ab', string_ab ; string_ab: db 'ab' silly {13,10}, crlf ; crlf: db 13,10
Makró és assembly utasítás%macro push 2
push %1push %2
%endmacro
push ax ; ez nem makrópush ax,bx ; ez makró
Címkék makróban• Makrón belül a címke lehet lokális
– Minden alkalmazásnál teljesen új cím keletkezik– Példa: „új utasítás” ami akkor tér vissza ha a zérus bit 1%macro retz 0
jnz %%skipret
%%skip:%endmacro
„Greedy” paraméterek• Az utolsó paraméter „magába foglalhat” több
paramétert is%macro PRINT 1+
JMP %%atlep%%szoveg:
DB %1,'$'%%atlep:
MOV DX,%%szovegMOV AH,9INT 21H
%endmacro
PRINT ‘Hello’, 13, 10
File beillesztése%include "macros.mac"
• Ha C programokhoz hasonlóan egy file-t csak egyszer akarunk beilleszteni:
%ifndef MACROS_MAC%define MACROS_MAC ; makrók definíciója%endif
Struktúrák• Alapesetben nincsennek struktúrák• Makrókkal lehet helyettesíteni
– Struktúra „típus” definíció:
struc mytypemt_long: resd 1 mt_word: resw 1 mt_byte: resb 1 mt_str: resb 32
endstruc
Struktúrák• A konkrét struktúramystruc: istruc mytype
at mt_long, dd 123456 at mt_word, dw 1024 at mt_byte, db 'x' at mt_str, db 'hello, world', 13, 10, 0
iend
• Hivatkozás egy elemremov ax,[mystruc+mt_word]
Egyéb adatszerkezet, lookup táblanapok:
PUSH DIPUSH SIMOV SI, NAP_CIMXOR AH, AH ; törlés; AX duplájaADD AX, AXADD SI, AXMOV DX, [SI]MOV AH, 09INT 21hPOP SIPOP DIRET
HET DB ’HETFO$’KED DB ’KEDD$’SZE DB ’SZERDA$’CSU DB ’CSUTORTOK$’PEN DB ’PENTEK$’SZO DB ’SZOMBAT$’VAS DB ’VASARNAP$’
NAP_CIM DW HET, KED, SZE,CSU, PEN, SZO,VAS
Paraméter: AL, nap száma
Egyéb adatszerkezet, jump tábla
...SHL BXCALL [JTABLA+BX]...
JTABLA:DW FVG0DW FVG1DW FVG2
FVG0:...RET
FVG1:...RET
FVG2:...RET