690 likes | 854 Views
Les 3: Gegevenstransfers + adresseermodes. Overzicht. Inleiding Registers Adresexpressies Gegevenstransfer Adresseermodes. Von Neumann-machine Fysiek zicht. BUS. adres. CVE. Controle. cache. data. klok. controle. ALU. registers. Geheugen. Invoer/Uitvoer. Het geheugen.
E N D
Overzicht • Inleiding • Registers • Adresexpressies • Gegevenstransfer • Adresseermodes
Von Neumann-machineFysiek zicht BUS adres CVE Controle cache data klok controle ALU registers Geheugen Invoer/Uitvoer
Het geheugen • Array van geheugencellen of BAU-cellen (basic addressable units) • Elke BAU-cel heeft een adres n bit 0 bau-cel 0 1 bau-cel 1 2 bau-cel 2 3 bau-cel 3 4 bau-cel 4 ...
Het geheugen • Typische BAU-cel groottes: bit, byte, woord • Bewerkingen op het geheugen: - lezen - schrijven
adres lezen data adres schrijven data Bewerkingen op geheugen geheugen CVE
8 0 1 2 3 4 5 6 7 Voorstelling van het geheugen 16 32 0 0 2 4 4 8 6 12 8 16 10 20 12 24 14 28
Overzicht • Inleiding • Registers • Adresexpressies • Gegevenstransfer • Adresseermodes
BUS Von Neumann-machineFysiek zicht BUS adres adres CVE Controle controle cache data data klok klok controle controle ALU ALU registers registers Geheugen Geheugen:bau-cellen RAM Invoer/Uitvoer Invoer/Uitvoer
32 accumulator EAX basis EBX counter ECX data EDX source index ESI destination index EDI basispointer EBP stack pointer ESP instruction pointer EIP flags EFLAGS IA32 registerverzameling Registerverzameling: IA32
DH DL BH BL AH AL CH CL IA32 registerverzameling 32 EAX AX EBX BX ECX CX EDX DX ESI SI EDI DI EBP BP ESP SP EIP IP FLAGS EFLAGS
Intel 64 registerverzameling RAX EAX AX AL RBX BX BL EBX RCX CX CL ECX RDX DX DL EDX RDI DI DIL EDI RSI SI SIL ESI RBP BP BPL EBP RSP SP SPL ESP R8 R8W R8L R8D R9 R9W R9L R9D … R15 R15W R15L R15D Registerverzameling: intel 64 (2004)
IA32 segmentregisters 16 gs fs ss es ds cs
EFLAGS NT IO O D I T S Z A P C carry nested task i/o level overflow direction interrupt trap sign zero auxiliary carry pariteit
IA32 Vlottende-komma/MMX registers 64 80 ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7 MMX0 MMX1 MMX2 MMX3 MMX4 MMX5 MMX6 MMX7 Registers: mmx
IA32 XMM registers 128 128 XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 XMM8 XMM9 XMM10 XMM11 XMM12 XMM13 XMM14 XMM15 IA32 X86-64
Alpha registerverzameling 64 64 r0 f0 ... ... ... ... r31 f31 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 PC Registerverzameling: alpha
Itanium registerverzameling • 128 registers voor algemeen gebruik (64 bit) [r0..r127] • 128 registers voor vlottende-kommagetallen (82 bit) [f0..f127] (goed voor double extended floating point formaat) • 64 predikaatregisters (1 bit) [p0..p63] • 8 sprongregisters (64 bit) [b0..b7] • Instructiewijzer (64 bit) Registerverzameling: itanium
Overzicht • Inleiding • Registers • Adresexpressies • Gegevenstransfer • Adresseermodes
Absoluut adres n 0 Absoluut adres = Effectief adres waarde
Verschuiving n 0 Basisadres offset Effectief adres waarde effectief adres = basisadres + offset
Indirect adres n 0 Primair adres Secun. adres Effectief adres waarde effectief adres = mem[primair adres]
mem16[2] mem8[11] mem32[5] Adresexpressie Beschouw het geheugen als een array van bytes 0 1 2 3 4 5 6 7 8 9 10 11 12 01 20 12 03 A3 F7 93 23 F2 AA 92 19 33 ...
reg[bx] reg[ip] reg[r2] Adresexpressie Beschouw alle registers als een array ax bx cx ip sp r1 r2 r3 r4
Voorbeeld typedef struct r { int a[5]; char b[5]; struct { int d, e; } c; struct r *n; } linklist; … a[0] a[1] a[2] a[3] a[4] c.d c.e n b[0]..b[4]
Berekening van offsets a[0] a[1] a[2] a[3] a[4] c.d c.e n b[0]..b[4] 8 bytes (2*4) 20 bytes (5*4) (5*4 + 5*1) 25 bytes 33 bytes (5*4 + 5*1 + 4 + 4)
Berekening van offsets r a[0] a[1] a[2] a[3] a[4] c.d c.e n b[0]..b[4] adresexpressie r r+4 r+20 r+25 r+33 mem8[r+20] mem32[r+25] adres van r adres van r.a[1] adres van r.b[0] adres van r.c.d adres van r.n waarde van r.b[0] waarde van r.c.d
Berekening van offsets r a[0] a[1] a[2] a[3] a[4] c.d c.e n b[0]..b[4] Dangling pointers! a[0] a[1] a[2] a[3] a[4] c.d c.e n b[0]..b[4] … adresexpressie adres van r.a[1] adres van r.n adres van r.n->a[1] r+4 r+33 mem32[r+33]+4
Berekening van offsets r a[0] a[1] a[2] a[3] a[4] c.d c.e n b[0]..b[4] out-of-bounds error! adresexpressie i (b.v. 1100) mem32[i] (b.v. 3) r+mem32[i]*4 mem32[r+mem32[i]*4] adres van i waarde van i adres van r.a[i] waarde van r.a[i] i 1100 ← i 3
Het geheugen • Bitnummering • Bytenummering • Alignatie
Opwaarts genummerd bitpatroon lengte n 0 1 2 3 . . . n-2 n-1 Bitnummering Neerwaarts genummerd bitpatroon lengte n n-1 n-2 . . . 3 2 1 0
31 30 ... 1 0 neerwaarts Bitnummering n n+1 n+2 n+3 n+4 n+5 n+6 n+7 n+8 n+9 0 1 ... 30 31 opwaarts Voordeel: consistent met byte adressering Voordeel: consistent met bitgewicht
32-bit gegeven Bytenummering:Big Endian n n+1 n+2 n+3 n+4 n+5 n+6 n+7 n+8 n+9 MSB LSB
Bytenummering:Little Endian n n+1 n+2 n+3 n+4 n+5 n+6 n+7 n+8 n+9 MSB LSB 32-bit gegeven
16 Big endian: Little endian: Voorbeeld Geheugen ... 78 9C 6B A2 28 18 10 00 19 A2 67 ... 100016 = 409610 001016 = 1610
Niet-gealigneerd 4n 2n n Alignatie Gealigneerd 4n 2n n
typedef struct r { int a[5]; struct { int d, e; } c; struct r *n; char b[5]; } linklist; alternatief Berekening van offsets r Niet-gealigneerd a[0] a[1] a[2] a[3] a[4] c.d c.e n b[0]..b[4] Gealigneerd a[0] a[1] a[2] a[3] a[4] c.d c.e n b[0]..b[4] Gat in de geheugenlayout (padding)
Overzicht • Inleiding • Registers • Adresexpressies • Gegevenstransfer • Adresseermodes
doel Gegevenstransfer bron breedte geheugen registers randapparaat geheugen registers randapparaat
Gegevenstransfer: mov 32 00 04 08 0C 10 00B00300 00004000 00330020 0003300A …. mov doel, bron voorbeelden 00004000 mov eax, ebx mov ebx, [4] eax 00920000 00000010 mov [8], ebx ebx 00000010 00004000 mov ecx, 64h ecx 03000440 00000064 Alle waarden zijn hexadecimaal! Instructie:mov
Load/store reg[r] = mem[bron] ld r, bron st r, doel mem[doel] = reg[r] Load/store architectuur
Verwisselen van twee waarden: xchg xchg doel, bron temp = doel doel = bron bron = temp Instructie:xchg
Little endian big endian bswap R Instructie:bswap
Bewaren en herstellen van registers mov ebp,10h mov [ebp], eax mov [ebp+4], ebx mov [ebp+8], ecx mov [ebp+0ch], edx …. mov eax, [ebp] mov ebx, [ebp+4] mov ecx, [ebp+8] mov edx, [ebp+0ch] mov [10h], eax mov [14h], ebx mov [18h], ecx mov [1ch], edx …. mov eax, [10h] mov ebx, [14h] mov ecx, [18h] mov edx, [1ch]
esp esp esp Werking van een stapel: push & pop 32 …. 00B00300 00004000 00330020 0003300A 1200 1204 1208 120C 1210 mov eax, 10h push eax 00000010 pop ebx eax 00920000 00000010 push bron Instructie:push ebx 00004000 00000010 esp pop doel 0000120C 00001208 0000120C Instructie:pop Alle waarden zijn hexadecimaal!
edx ecx ebx esp esp esp esp esp esp esp esp esp eax Bewaren en herstellen van registers op de stapel push eax push ebx push ecx push edx …. pop edx pop ecx pop ebx pop eax
pushad & popad pushad Instructie:pushad esp edi push van eax, ecx, edx, ebx, (oude esp), ebp, esi, edi esi ebp oude esp ebx popad Instructie:popad edx ecx pop van edi, esi, ebp, -, ebx, edx, ecx, eax eax
Lengte-aanduidingen mov [192900h], ax lengte = 2 bytes mov [192900h], 9 lengte = ? - mov byte ptr [192900h], 9 lengte = 1 bytes - mov word ptr [192900h], 9 lengte = 2 bytes - mov dword ptr [192900h], 9 lengte = 4 bytes
out port,al io[port] = reg[al] out port,ax io[port] = reg[ax] out port,eax io[port] = reg[eax] Input/Output: IA32 in al, port reg[al] = io[port] in ax, port reg[ax] = io[port] in eax, port reg[eax] = io[port] Instructie:out Instructie:in
Operaties op toestandregister lahf reg[ah] = reg[status] sahf reg[status] = reg[ah] pushfd reg[esp] = reg[esp] - 4 mem32[reg[esp]] = reg[status] popfd reg[status] = mem32[reg[esp]] reg[esp] = reg[esp] + 4 Instructie:lahf Instructie:sahf Instructie:pushfd Instructie:popfd