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
AH,2h
MOV
DL,2Ah
INT
21h
INT
20h
Szintakszis Összehasonlítás http://www.ibm.com/developerworks/linux/library/l-gas-nasm.html
Intel section .text
AT&T .section .text
global _start
.globl _start
_start:
_start:
mov eax, 1
movl $1, %eax
mov ebx, 2
movl $2, %ebx
int 80h
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
Assemblerek • TASM – Turbo Assembler
• GAS – GNU Assembler – AT&T szintakszis – Cross-platform
• WASM – Watcom Assembler
• HLA • …
Linker • EXE file-ok esetén – Assembler elegendő COM – Kapcsolat pl. 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
Felhasznált verem
SS:SP Szabad verem SS
CS:IP
Program CS
DS:DI DS:SI
Adat 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
NOP
Op. kód
Operandus
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
Kódba épített adat Példa: 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 MOV
AX, [DI] AX, [SI + 7FFh] 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 MOV
AX, [BP] [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 MOV
AX, 1111h 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, AX, DI, AH,
BX DI AX AL
MOV AL, 12h MOV AX, 1234h MOV CX, 4444h
Példák MOV MOV MOV MOV MOV MOV MOV MOV MOV
AX, [1234h] [1234h], DI AX, [DI] [DI], AX AX, [BX] AX, [BP] [BX + 12h], CX [BX+DI], AX AX,[BX+DI]
; AX <- DS:1234 ; DS:1234 <- DI
; AX <- DS:BX ; AX <- SS:BP ; DS:(BX+12h) <- CX
Példák MOV [BX+DI+33h], AX MOV AX,[BX+DI+33h]
Assembly utasítások • Általános szerkezet: Prefixum
Op. kód
Címzési mód Operandus
D W Op kód
mód
reg
reg/mem
Assembly utasítások D W Op kód
D: adatmozgatás iránya D=0
REG
REG/MEM
D=1
REG/MEM
REG
W: adat mérete W=0 az adat byte mé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 Op kód: 100010 D 1 W 1 mód 11 REG 101 REG/MEM 100
1110 1100 MOV R/M REG word méret regiszter BP SP
MOV BP, SP
Assembly utasítások • És így tovább – A további részletekbe nem megyünk bele
Programok
Futtatható programok • BAT – 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 Program INT 10h INT 13h INT 14h INT 16h INT 17h
INT 21h MS-DOS Op. rsz. ROM BIOS
IBM PC
IN és OUT utasítások
Megszakítások • INT 20h – 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
Megszakítások • INT 21h – 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
Megszakítások • AH = 8 – 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 MOV INT
AH, 2 DL,24h 21h
Megszakítások • AH=9 – 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 MOV INT DS:0200
AH, 9 DX, 200 21h
‘H’,’e’,’l’,’l’,’o’,’$’
Megszakítások • AH=0Ah – Bufferelt beolvasás – 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
NASM • Netwide Assembler – 80x86-os assembler – Támogatott formátumok • BIN, COM – Csak a kód, pl COM, SYS file-ok
• OBJ – 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
NASM – Támogatott formátumok • COFF – Common Object File Format
• ELF – Linux
• a.out – 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
NASM alapok • Általános formátum: nasm -f formátum file [-o kimenet]
• Például: nasm -f com alap.asm nasm -f com alap.asm -o alap.com
• Opciók -h további segítség -l file lefordított kód szöveges formátumban ...
NASM, egy másik program ORG 100h MOV MOV INT INT
ah,2 dl,2ah 21h 20h
; Mi a 2ah ????
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
NASM • Megjegyzések – A pontos vessző utáni rész a sor végéig
• Példa: ORG 100h MOV MOV INT INT
ah,2 dl,2ah 21h 20h
; ; ; ;
karakter nyomtatás csillag karakter funkció hívás kilépés
NASM • Számkonstansok számb számo számd számh -
bináris oktális decimális hexadecimális
• Karakter konstansok, idézőjelek között ’Ez egy string’ ”Ez is egy string”
NASM • Konstansok definiálása • Formátum: név EQU • Példa ABC
EQU 25 MOV AX, ABC MOV AX, 25
kif
; UGYANAZ
NASM, szimbólumok • Címkék – 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: Például: DAT: CHARS: text:
DB
kifejezés
DB DB DB
45d ’a’,’b’,’c’ ’Ez egy szoveg’
NASM, változók • • • • •
DB DW DD DQ DT
-
define byte define word define doubleword define quadword define tenbytes
NASM, változók, byte és word MOV MOV MOV
BX, CHARS AL, [BX] AX, [BX]
CHARS: DB
; ; ; ;
AL AL AH AX
’a’,’b’,’c’
== == == ==
‘a’ ‘a’ ‘b’ 6261