120 likes | 243 Views
Pentium IA-32 Maskinarkitekturen Kort resume – uge 5. Intel 4004 and Pentium 4. http://www.intel.com/museum/archives/index.htm http://download.intel.com/products/roadmap/roadmap.pdf Today several families/architectures (performance, power, cost). Pentium IA-32. software. IA-32. hardware.
E N D
Intel 4004 and Pentium 4 http://www.intel.com/museum/archives/index.htm http://download.intel.com/products/roadmap/roadmap.pdf Today several families/architectures (performance, power, cost)
Pentium IA-32 software IA-32 hardware
Maskinkode-niveauet • Registre • Lagermodellen • Datatyper • Maskininstruktioner • Instruktionsformater • Addresseringsformer
IA-32 Registre • 6 general-purpose 32-bit registre: • eax, ebx • ecx, edx • esi, edi • 4 special purpose 32-bit registre: • ebp – Pointer register der udpeger aktuelt stakafsnit. • esp – Pointer register der udpeger staktoppen. • eip – programtælleren (instruction pointer). • eflags – status register (Program Status Word – PSW).
0xFFFFFFFF stack ebp dynamisk lager (uallokeret) dynamisk lager (allokeret) bss uinitialiseret data (buffere) data initialiseret data text program 0x00000000 Linux IA-32 Lagermodellen Et 4Gb lineært, byte addresserbart lager opdelt i sektioner: esp heap eip
local 2 local 1 ebp esp old ebp old eip param 1 param 2 param n Funktionskald og stakafsnit Caller: 1. Lægparametrepåstak (omvendt). 2. Udførcallinstruktionen. Callee: 3. Etablernytstakafsnit. 4. Gørpladstillokale variable. 5. Udførkroppenaffunktionen. 6. Lægreturværdi i eaxregistret. 7. Nedlægstakafsnit. 8. Udførretinstruktionen. Caller: • Fjernparametrefrastak. * Bemærkaftagende addresser – vendt lager ebp-8 ebp-4 ebp+8 ebp+12
32 bit 32 bit 1-4 6-9 ebp ebp esp esp Stakafsnit parametre ebp + 8 old eip ebp + 4 old ebp ebp - 4 lokale variable
C eksempel intmain (void){long x = 42;long y = 53;long z = 0; z = max(x,y);exit(z);} intmax (long a,long b){long m = 0;if (a >= b) m = a;else m = b;return m;}
1-2 IA-32 Funktionskald (1) .section .datax: .long 42 y: .long 53 z: .long 0 .section .text.globl_start_start: # int main (void) pushl y # push y on stack pushl x # push x on stack call max # invoke max addl $8,%esp # pop parameters from stack movl %eax,z # z = max(x,y) (%eax) movl z,%ebx # return value in ebx register movl $1, %eax # opcode for exit system call int $0x80 # return z (%ebx) 9
3-4 .type max, @functionmax: # int max (long a,long b) pushl %ebp # push prev base pointer movl %esp,%ebp # setup new base pointer subl $4,%esp # local variable m movl $0,-4(%ebp) # m = 0 movl 8(%ebp),%eax # load a into eax movl 12(%ebp),%ebx # load b into ebx cmpl %eax,%ebx # compute b-a <=0, set eflags jle if # if (a >= b) jmp elseif: movl %eax,-4(%ebp) # m = a jmp endif else: movl %ebx,-4(%ebp) # m = y endif:movl -4(%ebp),%eax # return value in %eax movl %ebp,%esp # restore esp (remove locals)popl %ebp # restore ebp ret # return m 6-8
Funktionskald Stakken bruges til at implementere funktionskald. Maskininstruktionerne call og ret bruges: call A- læg “næste” eip på stakken og sæt “eip = A”. ret - sæt eip = top af stak og fjern øverste element. I visse tilfælde bruges maskininstruktionerne enter og leave. Konventionen fra C bruges: Application Binary Interface.