assembly - string És tömb kezelés
TRANSCRIPT
![Page 1: Assembly - String És Tömb Kezelés](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/1.jpg)
AssemblyString és tömb kezelés
Iványi Péter
![Page 2: Assembly - String És Tömb Kezelés](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/12.jpg)
MOVSB, példacldlea si, array1lea di, array2mov cx, 321rep movsb...
array1 repb 321array2 repb 321
![Page 13: Assembly - String És Tömb Kezelés](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/28.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/29.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/31.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/33.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/38.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/40.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/41.jpg)
„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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/42.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/43.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/44.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/45.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022081506/55cf914f550346f57b8c7929/html5/thumbnails/46.jpg)
Egyéb adatszerkezet, jump tábla
...SHL BXCALL [JTABLA+BX]...
JTABLA:DW FVG0DW FVG1DW FVG2
FVG0:...RET
FVG1:...RET
FVG2:...RET