. előadás Jegyzet 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 23 0 a teljes szám egy bittel hosszabb, erre majd fel kell készülni 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 szám nullával kezdődik, alakja megegyezik a nemnegatívakkal 0 0 0 0 0 not not not not not not not 0 0 0 + 0 0 0 0 negatív szám egyessel kezdődik
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 hasonlóak az általánosakhoz speciális céljuk van szegmensregiszterek ezekről nem lesz bővebben szó
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 kezdeté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ő byte-ok 00000000 00000005 a generált byte-ok 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