. előadás Kitlei Róbert kitlei.web.elte.hu Jegyzet: ssembly programozás www.inf.elte.hu Karunkról Kari digitális könyvtár
i az assembly? gépi kód: a számítógép által közvetlenül értelmezett és végrehajtott jelsorozat assembly: a gépi kód emberek számára könnyen értelmezhető reprezentációja
iért érdemes assemblyt tanulni? a legalacsonyabb absztrakciós szint a gépi kód felett gyors, hatékony bizonyos feladatokhoz nélkülözhetetlen új rálátást ad
ilyen assemblert használunk? architektúra: x86-32 két fő gyártó: D, Intel operációs rendszer: inux assembler: nasm több platformra is megtalálható linker: gcc
ilyen más tárgyak kapcsolódnak? Nagy hatékonyságú számítások RIC processzorokkal zeries (I nagygépek) Operációs rendszerek Programnyelvek I. és II.
Platform C64 start ldx #$0d cycle lda hworld,x sta $0400,x dex bne cycle hworld rts.text "hello world!!!"
Platform zeries nagygép TIT 'Hello World (V/C)' HO TRT R 2,0 UING *,2 * WRTR 'Hello World!' * R 5,5 R 4 * ND HO
Platform VX 0:.data.text.align.globl _main _main:.word 2 jbr 4 5:.data 7:.ascii "Hello, world.2"...
Platform x86, DO,.OD tiny.cod ORG 00h HO PROC OV H,09h DX,msg INT 2h OV X,4C00h INT 2h HO NDP msg D 'Hello World$' ND HO
Platform x86, DO, T ; WRITTN IN T (Turbo ssembler).od TIN COD GNT U C:COD, D:COD ORG 00h TRT: mov ah,9 mov dx,offt sg int 2h int 20h sg D 'Hello World',3,0,'$' COD ND ND TRT
Platform x86, NetD, gas.data msg:.string "Hello World\n" len:.long. msg.text.globl _start _start: push $len /* aenge */ push $msg /* dresse */ push $ /* tdout */ movl $0x4, %eax /* write */...
Platform x86, inux, nasm section.text global main main mov eax, 4 mov ebx, mov ecx, mov edx, H int 0x80 mov eax, xor ebx, ebx int 0x80 section.data H db Hello world
datábrázolás ogikai értékek hamis 0 bit igaz és and 0 vagy or 0 0 0 0 0 0 0 nem not kizáró vagy 0 0 0 xor 0 0 0
datábrázolás ogikai értékek bitmanipuláció and 0 0 0 0 0 0 nulla töröl 0 0 0 0 0 or 0 0 0 0 0 0 0 0 egyes beállít 0 0 xor 0 0 0 0 0 0 0 egyes átvált 0 0 0 0 0 eredeti módosító spec. alk. önmagával módosítás: törlés
datábrázolás Nemnegatív számok a bitek sorban a bitek sorszáma számok előjel nélkül 0 0 0 7 6 5 4 3 2 0 2 7 2 6 2 5 2 4 2 3 2 2 2 2 0 28 64 32 6 8 4 2 2 7 + 0 2 6 + 0 2 5 + 2 4 + 2 3 + 2 2 + 0 2 + 2 0 a szám értéke: 57 0 leírása: 000b az egyes bitek helyi értékei
datábrázolás Nemnegatív számok a kezdeti szám ha páros a szám, 2 0 6 nullát írunk, ha 2 2 2 2 3 30 5 7 0 páratlan, egyet majd osztunk kettővel, és folytatjuk amíg maradt a 2 4 3 számból 2 5 2 6 ekkor a végeredményt alulról felfele olvasva kapjuk: 6 = 0 0 2
datábrázolás Nemnegatív számok hexadecimális (tizenhatos) számrendszer 0.. 9 mint tízesben számok leírása 0 0 0 0 0xCD = 4398 0 0 0 2 0 C 0 0 0h = 0 0 3 0 D 0 h posztfixszel 4 0 0 nullát kell írni 5 0 F elé, ha betűvel kezdődik
datábrázolás Nemnegatív számok összeadás 2 8 2 7 2 6 2 5 2 4 2 3 2 2 2 2 0 0 0 22 0 0 0 0 0 0 23 0 az összeg egy bittel hosszabb, erre majd fel kell készülni (átvitel) 0 0 0 0 2 + 2 + 2 = 2 0 2 +0 2 + 2 = 2 nem keletkezik túlcsordulás 2 + 2 =0 2 a nullát leírjuk, az egyes túlcsordul 434 0
datábrázolás lőjeles számok +52 negálás bitenként not, majd egy hozzáadása -52 nyolc biten ábrázolva ún. kettes komplemens alak nemnegatív előjeles szám nullával kezdődik, alakja megegyezik az előjel nélküliekével 0 0 0 0 0 not not not not not not not 0 0 0 + 0 0 0 0 a szám legfelső bitje mutatja az előjelét (: negatív)
datábrázolás CII karakterek Karakter Ö ű Θ
datábrázolás CII karakterek Karakter Ö ű Θ Karakterkészlet CII IO 8859- Unicode
datábrázolás CII karakterek Karakter Karakterkészlet Kód (hexa) kódolás: CII CII 4 Ö IO 8859- kódolás: IO 8859- D6 ű Unicode 0 7 Θ 03 98 kódolás: UTF-8
datábrázolás CII karakterek Karakter Karakterkészlet Kód (hexa) Ö IO 8859- D6 IO 8859-7 Θ
datábrázolás CII karakterek karakter új sor kocsivissza kódja 0 0 0D 3 szóköz 20 32.. Z 4..5 65..90 a.. z 6..7 97..22 megjegyzés a sorvége jelzése DO, Windows 0D 0, Unix, inux alatt 0 0.. 9 30..39 48..57 a számjegyek az angol ábécé betűi sorban, kihagyás nélkül sok karakter nincs benne, ezért fejlesztették ki a Unicode-ot minden karaktert egy nyolc bites számmal kódolunk
memória felépítése R lineáris memóriamodell a memória byte-ok sorozata mindegyiknek egy 32 bites címe van DD DDF D0 memóriacímek D... 60 0D C0 D... a memória tartalma
memória felépítése R lineáris memóriamodell egy lépésben kezelhető adatok byte 8 bit word 6 bit szó dword 32 bit duplaszó a memóriában byte-onként fordított sorrendben tárolódnak (little-endian) 0C7 0C7F 0C80 0C8... F 5 F 0C82 57... az 0C7 címen található duplaszó értéke: F5F 6 =426735706 0 az 0C8 címen található szó értéke: 57F 6 =22526 0
memória felépítése Regiszterek 7 az általános célú regiszterek D F4 0 0 0 0 0 0 0 0 0 0 0 3 30 29 28 27 26 25 24 23 22 2 20 9 8 7 6 5 4 3 2 0 9 8 7 6 5 4 3 2 0 eax ebx ecx edx esi edi a regiszter bitjei sorszámmal (vö. helyi érték) az általános célú regiszterek: eax, ebx, ecx, edx, esi, edi
memória felépítése Regiszterek az általános célú regiszterek 7 D F4 0 0 0 0 0 0 0 0 0 0 0 3 30 29 28 27 26 25 24 23 22 2 20 9 8 7 6 5 4 3 2 0 9 8 7 6 5 4 3 2 0 ax bx cx dx si di eax ebx ecx edx esi edi a regiszter bitjei sorszámmal (vö. helyi érték) az általános célú regiszterek: eax, ebx, ecx, edx, esi, edi 32 bitesek, egyes részeik külön névvel rendelkeznek
memória felépítése Regiszterek az általános célú regiszterek 7 D ah bh ch dh al bl cl dl F4 0 0 0 0 0 0 0 0 0 0 0 3 30 29 28 27 26 25 24 23 22 2 20 9 8 7 6 5 4 3 2 0 9 8 7 6 5 4 3 2 0 ax bx cx dx si di eax ebx ecx edx esi edi a regiszter bitjei sorszámmal (vö. helyi érték) az általános célú regiszterek: eax, ebx, ecx, edx, esi, edi 32 bitesek, egyes részeik külön névvel rendelkeznek
memória felépítése Regiszterek további 32 bites regiszterek jelzőbitek regisztere átviteli jelzőbit (carry) veremkezelő regiszterek: esp, ebp ezek is általános célúak csak a futási idejű verem kezelésére használjuk őket
fordítás menete agasszintű forráskód x.cpp y.adt z.hs Fordítóprogram g++ gnat ghc ssembly forráskód a.asm x.asm y.asm z.asm ssembler nasm g++ gas fasm Tárgykód a.o x.o y.o z.o
fordítás menete Tárgykód a.o x.o y.o z.o zerkesztő gcc Futtatható állomány a.out
z első program Programkód section.text ; a kódszegmens kezdete global main ; a program legyen elindítható main ; a program belépési pontját jelző címke mov eax, 4 ; a rendszerszolgáltatás mov ebx, ; paramétereinek beállítása: mov ecx, szoveg ; szöveg kiírása a képernyőre mov edx, 6 ; a szoveg címkéről 6 hosszan int 0x80 ; rendszerszolgáltatás hívása mov eax, ; a kilépés paramétereinek mov ebx, 0 ; beállítása int 0x80 ; rendszerszolgáltatás hívása: kilépés section.data ; az adatszegmens kezdete szoveg db Hello, 0x ; a szöveg, végén egy újsorral
z első program Fordítás, futtatás fordítás és futtatás > nasm hellovilag.asm -f elf > gcc hellovilag.o -o hellovilag >./hellovilag Hello > hellovilag.o hellovilag
z első program memóriacím az utasítás kódja 00000000 00000005 0000000 0000000F 0000004 0000006 000000 00000020 a memóriában sorban megjelenő bájtok 00000000 00000005 a generált bájtok a paraméterek kódolt alakja 8 04000000 0000000 9 00000000 06000000 CD 80 8 0000000 00000000 CD 80 48 65 6C 6C 6F 0 az eredeti forrásszöveg section.text ; ez a 3 sor global main ; nem generál main ; kódot mov eax, 4 mov ebx, mov ecx, szoveg mov edx, 6 int 0x80 mov eax, mov ebx, 0 int 0x80 section.data szoveg db Hello db 0x ista
Utasítások datmozgatás mnemonik mov edx, ebx mov bh, 9 edx a céloperandus ebx a forrásoperandus mov ah, 0h ; 0 nélkül más mov ecx, 0xFDC ; a teteje nullákkal töltődik fel mov feltétel nélküli adatmozgatás általános elv a forrás és a cél hosszának meg kell egyeznie mov edi, címke ; edi címke értékét veszi fel, ami egy szám HTN mov ebx, [címke] mov eax, bl ; ebx a címke által jelölt mov [c], [c2] ; memóriacímen található ; duplaszó értékét veszi fel
Utasítások Tegyük fel, hogy címke értéke 0x0D7DD. kkor datmozgatás mov feltétel nélküli adatmozgatás mov ecx, címke hatása mov ecx, 0x0D7DD olyan, mint 0D7DD 0D7D 0D7DF 0D770 0D77... C C 5 77 42...
Utasítások Tegyük fel, hogy címke értéke 0x0D7DD. kkor datmozgatás mov feltétel nélküli adatmozgatás hatása olyan, mov ecx, [címke] mint mov ecx, 0x775CC little endian bájtsorrend 0D7DD 0D7D 0D7DF 0D770 0D77... C C 5 77 42...
Utasítások meg kell adni a méretet, csak a címből nem derül ki datmozgatás mov feltétel nélküli adatmozgatás mov dword [56789Dh], 0xC07D mov word [456789Ch], 59Dh mov byte [456789h], 4567899 456789 456789 456789C 456789D... 0 9D 456789D 5... 56789C 56789D 56789 56789F 56789C0... D 7 C0 7...
Utasítások datmozgatás movzx előjel nélküli hosszkiterjesztés movsx előjeles hosszkiterjesztés xchg adatok felcserélése movsx és movzx: a cél hosszabb, mint a forrás movzx: nullákkal terjeszt ki movsx: a felső bittel terjeszt ki mov al, 0000000b movzx bx, al ; bx = 000000000000000b movsx cx, al ; cx = 0000000b xchg bx, cx ; bx = 0xFF80, cx = 0x0080 HTN movzx eax, ebx movsx ax, edi xchg bl, edx
Utasítások ogikai műveletek not logikai nem and logikai és or logikai vagy xor logikai kizáró vagy mov al, 000b not al ; al = 00000b and al, 00000b ; al = 0000000b or al, 0000b ; al = 000b xor al, 0000b ; al = 000b
Utasítások ritmetikai műveletek inc érték növelése add összeadás dec érték csökkentése mov al, 6 mov dl, 5 sub al, dl ; al = inc al ; al = 2 add al, al ; al = 4 dec al ; al = 3 neg al ; al = -3 előjelesen hatása ekvivalens ezzel: not al inc al ; előjel nélkül: 253 sub kivonás neg negáció
Utasítások ritmetikai műveletek mul előjel nélküli szorzás imul előjeles szorzás div előjel nélküli osztás idiv előjeles osztás egyoperandusúak, ennek hosszától függően a másik: byte: ax illetve al (osztás maradéka: ah) szó: dx:ax illetve ax (osztás maradéka: dx) duplaszó: edx:eax illetve eax (osztás maradéka: edx) dx:ax és edx:eax regiszterek úgy tekintendőek, mintha egy 32 (64) bites regisztert alkotnának összeolvasva. HTN div 2 div byte 2 mul eax, 3
Utasítások ritmetikai műveletek mul előjel nélküli szorzás imul előjeles szorzás div előjel nélküli osztás idiv előjeles osztás mov al, 5 mov dx, 0x0F ; dl = -2, dh = 0 mov bx, 20000 mul dh ; ax = 50 = 0x0032, dl marad imul dl ; ax = 0xFF9C = -00 div bx ; ez nem ax-ot osztja, hanem dx:ax-ot: ; 0x0FFF9C = 84 483 740 ; ax = 9224, dx = 3740 = 0x09C, dl = -00 idiv dl ; al = -92 = 0x4, ah = 24
Utasítások itforgatás shl és shr bitléptetés balra/jobbra sal és sar aritmetikai léptetés balra/jobbra rol és ror bitforgatás balra/jobbra mov eax, 0x38F ; eax = 000000b shr eax, 3 ; eax = 000000000b shl eax, 5 ; eax = 0000000000b ror eax, 7 ; eax = 0000000000b rol eax, 3 ; eax = 0000000000b sar eax, 4 ; eax = 00000000b sal eax, 2 ; eax = 0000000000b kettőhatvánnyal szorzás shl, shr: előjel nélkül sal, sar: előjelesen
Utasítások Feltételvizsgálat cmp összehasonlítás jmp feltétel nélküli ugrás ja, jb, jc,... feltételes ugrások egy feltételvizsgálat két sorból áll cmp eax, ebx ; beállítja a jelzőbiteket je cimke ; a jelzőbitek állása szerint ugrik ; ha a feltétel nem áll fenn, a program ; a következő utasítással folytatódik a feltételes ugrások alakja < > nem előjeles jb, jnae jbe, jna ja, jnbe jae, jnb jelzőbitek je, jne = jz, jnz egyenlőség előjeles jl, jnge jle, jng jg, jnle jge, jnl jc, jnc átvitel
Utasítások ogikai műveletek bt bittesztelés bts bittesztelés és beállítás btc bittesztelés és törlés btr bittesztelés és fordítás seta,... feltételes értékbeállítás mov al, 00000b bt al, 0 ; átviteli bit =, al = 00000b bts al, 3 ; átviteli bit = 0, al = 0000b btc al, 5 ; átviteli bit =, al = 00000b btr al, 7 ; átviteli bit = 0, al = 0000b cmp al, 0000b sete dl ; dl =