assembly - string És tömb kezelés

46
Assembly String és tömb kezelés Iványi Péter

Upload: gabor-szilagyi

Post on 23-Dec-2015

17 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Assembly - String És Tömb Kezelés

AssemblyString és tömb kezelés

Iványi Péter

Page 2: Assembly - String És Tömb Kezelés

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

Page 3: Assembly - String És Tömb Kezelés

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

Page 4: Assembly - String És Tömb Kezelés

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

Page 5: Assembly - String És Tömb Kezelés

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

Page 6: Assembly - String És Tömb Kezelés

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

Page 7: Assembly - String És Tömb Kezelés

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

Page 8: Assembly - String És Tömb Kezelés

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

Page 9: Assembly - String És Tömb Kezelés

Direction bitcld...call fvg... ; cld-t várjuk, de std lesz

fvg:std; string műveletret

Page 10: Assembly - String És Tömb Kezelés

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

Page 11: Assembly - String És Tömb Kezelés

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

Page 12: Assembly - String És Tömb Kezelés

MOVSB, példacldlea si, array1lea di, array2mov cx, 321rep movsb...

array1 repb 321array2 repb 321

Page 13: Assembly - String És Tömb Kezelés

MOVSW, példacldlea si, array1lea di, array2mov cx, 321 ; elemek száma, nem a byterep movsw...

array1 repw 321array2 repw 321

Page 14: Assembly - String És Tömb Kezelés

MOVSB, mi történikcldlea si, array1lea di, array2mov cx, 321rep movsb...

array1 db 0array2 repb 321

Page 15: Assembly - String És Tömb Kezelés

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

Page 16: Assembly - String És Tömb Kezelés

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

Page 17: Assembly - String És Tömb Kezelés

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

Page 18: Assembly - String És Tömb Kezelés

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

...

Page 19: Assembly - String És Tömb Kezelés

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

Page 20: Assembly - String És Tömb Kezelés

MOVSx példa 1.• 4099 byte másolása

cldlea si, forraslea di, celmov cx, 1024 ; 4096 byterep movsdmovsw ; 2 bytemovsb ; 1 byte...

Page 21: Assembly - String És Tömb Kezelés

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:

Page 22: Assembly - String És Tömb Kezelés

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

Page 23: Assembly - String És Tömb Kezelés

CMPSx, példacldlea si, s1lea di, s2mov cx, 7repe cmpsb... ; státusz bitek ellenőrzése

s1 db ’String1’s2 db ’String1’

Page 24: Assembly - String És Tömb Kezelés

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:

Page 25: Assembly - String És Tömb Kezelés

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ő

Page 26: Assembly - String És Tömb Kezelés

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

Page 27: Assembly - String És Tömb Kezelés

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

Page 28: Assembly - String És Tömb Kezelés

LODSx példa• Minden karakterhez adjunk 1-et

cldmov si, tombmov di, simov cx, tomb_hossza

ismet:lodsbinc alstosbdec cxjnz ismet

Page 29: Assembly - String És Tömb Kezelés

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

Page 30: Assembly - String És Tömb Kezelés

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

Page 31: Assembly - String És Tömb Kezelés

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

Page 32: Assembly - String És Tömb Kezelés

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'

Page 33: Assembly - String És Tömb Kezelés

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

Page 34: Assembly - String És Tömb Kezelés

Több soros makró%macro BillVar 0

MOV AH,0INT 16H

%endmacro• Makró neve: BillVar• Nincs paramétere: 0• Hívás:

BillVar

Page 35: Assembly - String És Tömb Kezelés

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

Page 36: Assembly - String És Tömb Kezelés

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

Page 37: Assembly - String És Tömb Kezelés

Több soros makrófvg: bevezetes 12

fvg: push ebp mov ebp,esp sub esp, 12

További paraméterek esetén: %2, %3

Page 38: Assembly - String És Tömb Kezelés

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

Page 39: Assembly - String És Tömb Kezelés

Makró és assembly utasítás%macro push 2

push %1push %2

%endmacro

push ax ; ez nem makrópush ax,bx ; ez makró

Page 40: Assembly - String És Tömb Kezelés

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

Page 41: Assembly - String És Tömb Kezelés

„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

Page 42: Assembly - String És Tömb Kezelés

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

Page 43: Assembly - String És Tömb Kezelés

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

Page 44: Assembly - String És Tömb Kezelés

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]

Page 45: Assembly - String És Tömb Kezelés

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

Page 46: Assembly - String És Tömb Kezelés

Egyéb adatszerkezet, jump tábla

...SHL BXCALL [JTABLA+BX]...

JTABLA:DW FVG0DW FVG1DW FVG2

FVG0:...RET

FVG1:...RET

FVG2:...RET