Assembly Címzési módok Iványi Péter
Gépi kód Gépi kód = amit a CPU megért 1-13 byte hosszúak lehetnek az utasítások Kb. 20 000 variációja van a gépi kódú utasításoknak Számítógép architektúrától függ Feszültség szintek adják meg az utasítást Emberi formában 0 és 1 segítségével írjuk le 10100001 10111100 10010011 00000100 00001000 00000011 00000101 11000000
Assembly és assembler Emberek által nehezen kezelhető a gépi kód Picit olvashatóbb a hexadecimális írás A1 BC 93 04 08 03 05 C0 93 04 08 Assembly = a programozási nyelv mnemonikus parancsok: angol kifejezések rövidítése szimbolikus címek: memória címeket értelmes nevekkel látunk el Ismerni kell a gép felépítését
Assembly Simple.com B4 02 B2 2A CD 21 CD 20 Assembly: MOV MOV INT INT AH,2h DL,2Ah 21h 20h
Szintakszis Összehasonlítás http://www.ibm.com/developerworks/linux/library/l-gas-nasm.html Intel section.text global _start _start: mov eax, 1 mov ebx, 2 int 80h AT&T.section.text.globl _start _start: movl $1, %eax movl $2, %ebx int $0x80
Assemblerek Assembler = emberi formában leírt assembly utasításokat fordít le gépi kódra ( számsorozattá ) Nagyon sokféle assembler van NASM Netwide Assembler Cross-platform http://nasm.sourceforge.net MASM Visual Studio része ml.exe néven http://www.masm32.com
TASM Turbo Assembler GAS GNU Assembler AT&T szintakszis Cross-platform WASM Watcom Assembler HLA Assemblerek
Linker EXE file-ok esetén Assembler elegendő COM Kapcsolatpl. Windows-al vagy C programokkal alink http://alink.sourceforge.net Cross-platform GNU/LD GNU Cross-platform
Program és adatterület szervezése Eredeti SP SS:BP SS:SP Felhasznált verem Szabad verem SS CS:IP DS:DI DS:SI Program Adat CS DS
Assembly utasítások Assembly utasítás megfelel a processzor gépi kódú utasításainak A gépi kódú utasítás = számkód melyeket a memóriába kell tölteni Utasítás: Operációs kód (mit kell tenni) Operandus (mivel) Általában egy adatnak a címe
Assembly utasítások Egy utasítás hossza lehet egy vagy több byte Általános szerkezet: Prefixum Op. kód Címzési mód Operandus Op. kód Op. kód Operandus NOP MOV AX, 16 Op. kód Címzési mód MOV AL, AH Op. kód Címzési mód Operandus MOV [BX+3], AX
Adatterület címzése MOV utasítás használható adatmozgatásra Például: MOV AX, op az op értékét tölti be az AX regiszterbe MOV op, AX az AX regiszter értékét tölti be az op-ba Az op sok minden lehet
Adatterület címzése Kódba épített adat (immediate addressing) Direkt memóriacímzés Indexelt címzés Regiszter indexelt címzés Bázisrelatív címzés
Példa: Kódba épített adat MOV AX, 07ffh az AX regiszterbe a 07ffh érték kerül Az adat a kódterületen tárolódik!! Utasítás kódja: B8 FF 07 Az 3 byte-ból áll B8: operációs kód
Direkt memóriacímzés A kódban elhelyezett 16 bites szám az adat címe MOV AX, [07FFh] Nem szabad elfelejteni, hogy szegmens regiszter is van (DS) Például: DS = 1376h Akkor az AX-be töltendő adat címe: 1376:07FF
Direkt memóriacímzés Assembler-ben szimbólikusan is meg lehet adni ADAT DW 34F2h... MOV AX, [ADAT] Az AX regiszterbe a 34F2h kerül az utasítás után. Ha az ADAT szimbólikus változó éppen a 07FFh címre esik, akkor a kód: A1 FF 07
Indexelt címzés A megadott 8 vagy 16 bites számot hozzáadjuk az index regiszterhez. Az így keletkezett 16 bites címet használja az aktuális szegmens regiszterrel Például: MOV MOV AX, [DI] AX, [SI + 7FFh] MOV AX, [DI - 10h]
Indexelt címzés MOV AX, [SI + 7Fh] Ha SI = 12E0h A DS szegmens elejétől számítva 12E0+7F címen kezdődő adatot olvassa be AX-be
Indexelt címzés 8 bites eltolás esetén MOV AX, [SI + 7Fh] 8B 45 7F 16 bites eltolás esetén MOV AX, [SI + 7FFh] 8B 85 FF 07
Indexelt címzés Túlcsordulást a rendszer eldobja DI = FF00h Eltolás = 07FF A cím: 06FFh Negatív eltolás is lehet
Indexelt címzés használata Adatstruktúra esetén Struktúra címe az indexregiszterben Eltolás adja meg a struktúra elemét Buffercímzés Eltolás a buffer címe Indexregiszter a bufferen belüli cím
Regiszter indexelt címzés Az indexelt címzés speciális esete, ahol az eltolás zérus Példák: MOV MOV MOV AX, [DI] AX, [SI] AX, [BX]
Bázisrelatív címzés Azonos az indexelt címzéssel, de BX regisztert használjuk Kombinálható az indexelt címzéssel Példa: MOV AX, [BX] ; speciális MOV AX, [057Fh + DI + BX]
Bázisrelatív címzés A BX regiszter esetén a DS szegmens regisztert használja a rendszer A BP regiszter esetén az SS szegmens regisztert használja a rendszer A BP regiszter a verem (stack) esetén használatos
Címzési módok BX DI Eltolás BP SI Az oszlopok egymással nem kombinálhatók!!! Példák: [BX] [BX+DI] [BP+DI+eltol] stb.
Címzési módok Minden utasítás csak egyszer férhet hozzá a memóriához Érvénytelen!!!!: MOV [BX], [BP] Érvényes MOV AX, [BP] MOV [BX], AX
Címzési módok Operandusok mérete meg kell egyezzen 8 bites számot csak 8 bites számmal lehet összehasonlítani 16 bites számot csak 16 bites számmal lehet összehasonlítani Érvénytelen: CMP AH, AX
Címzési módok A szegmens regiszterekbe nem lehet közvetlenül írni Érvénytelen!!!!: MOV DS, 1111h Érvényes MOV AX, 1111h MOV DS, AX
Címzési módok Ha számot írunk, figyeljünk, hogy egyértelmű legyen: MOV bl, ah Az ah most egy regiszter vagy a hexadecimális A számnak felel meg? MOV bl, 0ah
Példák MOV MOV MOV MOV AX, BX AX, DI DI, AX AH, AL MOV AL, 12h MOV AX, 1234h MOV CX, 4444h
Példák MOV AX, [1234h] ; AX <- DS:1234 MOV [1234h], DI ; DS:1234 <- DI MOV AX, [DI] MOV [DI], AX MOV AX, [BX] ; AX <- DS:BX MOV AX, [BP] ; AX <- SS:BP MOV [BX + 12h], CX ; DS:(BX+12h) <- CX MOV [BX+DI], AX MOV AX,[BX+DI]
MOV [BX+DI+33h], AX MOV AX,[BX+DI+33h] Példák
Általános szerkezet: Assembly utasítások Prefixum Op. kód Címzési mód Operandus D W Op kód mód reg reg/mem
Assembly utasítások Op kód D W D: adatmozgatás iránya D=0 REG REG/MEM D=1 REG/MEM REG W: adat mérete W=0 az adat byteméretű W=1 az adat word méretű, védett módban dupla word
Assembly utasítások mód reg reg/mem Mód 00 01 10 11 Nincs eltolás 8 bites eltolás 16 bites eltolás REG/MEM egy regiszter MOV AL, [DI] nincs eltolás (mód: 00) MOV AL, [DI+2] 8 bites eltolás (mód: 01)
Assembly utasítások mód reg reg/mem REG W=0 (Byte) W=1 (Word) W=1 (Dword) 000 AL AX EAX 001 CL CX ECX 010 DL DX EDX 011 BL BX EBX 100 AH SP ESP 101 CH BP EBP 110 DH SI ESI 111 BH DI EDI
Assembly utasítások 16 bites mód, 8Bh ECh Bináris módban: 1000 1011 1110 1100 Op kód: 100010 MOV D 1 R/M REG W 1 word méret mód 11 regiszter REG 101 BP REG/MEM 100 SP MOV BP, SP
És így tovább Assembly utasítások A további részletekbe nem megyünk bele
Programok
BAT Futtatható programok Script: Operációs rendszerek tantárgy COM Csak egy szegmensből áll max: 64KByte EXE Bármekkora lehet a mérete
Futtatás 1. Op rendszer lefoglal egy memória területet A memória terület elején előkészít egy programszegmens leíró blokkot (Program Segment Prefix, PSP) COM esetén az egyetlen szegmens elején EXE esetén külön szegmens elején Betölti a programot a PSP után EXE esetén relokációt elvégzi
Futtatás 2. Regiszterek előkészítése EXE esetén DS, ES -a PSP-re mutat SS:SP -verem szegmensre mutat CS:IP -a belépési pontra mutat COM esetén CS, DS, ES, SS -közös szegmensre mutat SP -a verem tetejére mutat IP -100h
Kommunikáció a rendszerrel INT 21h Program MS-DOS Op. rsz. ROM BIOS INT 10h INT 13h INT 14h INT 16h INT 17h IN és OUT utasítások IBM PC
INT 20h Megszakítások Kilépés a programból hagyományos módon Ebben az esetben a CS regiszternek a PSP-t tartalmazó szegmensre kell mutatnia Ez alapból teljesül COM programoknál EXE programnál más kilépést használunk majd
INT 21h Megszakítások Az AH regiszter határozza meg a funkciót AH = 1 Olvasás a szabványos bemenetről A karaktert visszaírja a képernyőre!!! A beolvasott karakter ASCII kódja az AL regiszterben tárolódik Ha nincs ASCII kódja (funkció billentyű), akkor AL értéke nulla és a második olvasásra a billentyű scan kódját kapjuk meg AL-ben
AH = 8 Megszakítások Ugyanaz mint AH=1, csak nem írja vissza a karaktert a képernyőre AH=2 A DL regiszterben tartalmazott karaktert kinyomtatja a képernyőre Példa: MOV AH, 2 MOV DL,24h INT 21h
AH=9 Megszakítások A DS:DX címen levő stringet kinyomtatja a képernyőre A string végét a dollár jel jelzi ($) Példa: MOV AH, 9 MOV DX, 200 INT 21h DS:0200 H, e, l, l, o, $
AH=0Ah Bufferelt beolvasás Megszakítások A DS:DX egy olyan bufferre mutat, melynek első két byte-ja vezérlő jellegű, a többiben tárolható az adat 1. Byte: a buffer tényleges hossza, melybe az ENTER is belefér 2. Byte: a ténylegesen beolvasott byte-ok száma A rendszer nem enged többet beolvasni, ilyenkor sípol és csak törölni lehet, vagy ENTER-t nyomni
Netwide Assembler 80x86-os assembler Támogatott formátumok BIN, COM OBJ NASM Csak a kód, pl COM, SYS file-ok Microsoft tárgykód (object), MS-DOS 16 bites kód A linker-el EXE file-t hozhatunk létre WIN32 Microsoft WIN32 -es kód
Támogatott formátumok COFF ELF a.out NASM Common Object File Format Linux Linux aoutb NetBSD/FreeBSD/OpenBSD
NASM alapok COM file létrehozása Legegyszerűbb program: alap.asm org 100h int 20h Fordítás: nasm -oalap.com alap.asm
Általános formátum: Például: Opciók NASM alapok nasm -f formátum file [-o kimenet] nasm -f com alap.asm nasm -f com alap.asm -o alap.com -h további segítség -l file lefordított kód szöveges formátumban...
NASM, egy másik program ORG 100h MOV ah,2 MOV dl,2ah ; Mi a 2ah???? INT 21h INT 20h
ASCII tábla
NASM -l opció, map file 1 org 100h 2 00000000 B402 MOV AH,2h 3 00000002 B22A MOV DL,2Ah 4 00000004 CD21 INT 21h 5 00000006 CD20 INT 20h 6
Megjegyzések NASM A pontos vessző utáni rész a sor végéig Példa: ORG 100h MOV ah,2 ; karakter nyomtatás MOV dl,2ah ; csillag karakter INT 21h ; funkció hívás INT 20h ; kilépés
NASM Számkonstansok számb - bináris számo - oktális számd - decimális számh - hexadecimális Karakter konstansok, idézőjelek között Ez egy string Ez is egy string
Konstansok definiálása Formátum: NASM név EQU kif Példa ABC EQU 25 MOV AX, ABC MOV AX, 25 ; UGYANAZ
Címkék NASM, szimbólumok Programterületen használjuk, Ugró utasítás operandusai Formátum: címke:
NASM, változók Név: Kezdődhet: Betűvel (a-z), ponttal (.) További karakterek: Betű (a-z), szám (0-9), @, _, $ Terület foglalás név: DB kifejezés Például: DAT: DB 45d CHARS: DB a, b, c text: DB Ez egy szoveg
NASM, változók DB - define byte DW - define word DD - define doubleword DQ - define quadword DT - define tenbytes
NASM, változók, byte és word MOV BX, CHARS MOV AL, [BX] ; AL == a MOV AX, [BX] ; AL == a ; AH == b ; AX == 6261 CHARS: DB a, b, c