assembly - string És tömb kezelés

Post on 23-Dec-2015

17 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

top related