530 likes | 682 Views
Pentium IA-32 Maskinarkitekturen. Historie (1). Starter i 1970 med udviklingen af Intel 4004:. Historie (2). Bagl æns kompatibilitet tilbage til 8086. Intel 4004 and Pentium 4. http://www.intel.com/museum/archives/index.htm. Dokumentation. Officiel dokumentation fra Intel (Pentium 4):
E N D
Historie (1) Starter i 1970 med udviklingen af Intel 4004:
Historie (2) Baglæns kompatibilitet tilbage til 8086.
Intel 4004 and Pentium 4 http://www.intel.com/museum/archives/index.htm
Dokumentation • Officiel dokumentation fra Intel (Pentium 4): • Software Developer’sManual: • Volume 1:Basic Architecture (450 pp). • Volume 2A: Instruction Set Reference (A-M) (596 pp). • Volume 2B: Instruction Set Reference (N-Z) (428 pp). • Volume 3:System Programming Guide (836 pp). • se endvidere: • http://www.intel.com/design/Pentium4/documentation.htm
Pentium IA-32 software IA-32 hardware
Maskinkode-niveauet • Registre • Lagermodellen • Datatyper • Maskininstruktioner • Instruktionsformater • Addresseringsformer
Registre • 6 general-purpose 32-bit registre: • eax – akkumulator for operander og resultater. • ebx – bruges oftest til pointere (lager adresser). • ecx – bruges specielt ifm. løkker. • edx – bruges specielt ifm. multiplikation/division. • esi/edi – bruges specielt ifm. manipulation af strenge. • 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). • Derudover et antal registre ifm. segmenter, MMX, FPU,…
Registre • 6 general-purpose 32-bit registre: • eax – akkumulator for operander og resultater. • ebx – bruges oftest til pointere (lager adresser). • ecx – bruges specielt ifm. løkker. • edx – bruges specielt ifm. multiplikation/division. • esi/edi – bruges specielt ifm. manipulation af strenge. • 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). • Derudover et antal registre ifm. segmenter, MMX, FPU,… IJVM LV SP PC
Eksempel: EFLAGS register Fungerer som Program Status Word (PSW): CF – overflow på ikke-negative heltals operationer. OF – overflow på heltals operationer.
Lagermodel • Fysisk addresserum med 236 8-bit (byte) celler (64Gbytes). • Tre lagermodeller understøttes: • Flad lagermodel: 4Gb lineært lager, byte addresserbart • Program, data og stak i samme addresserum. • Segmenteret lagermodel: 16,384 segmenter op til 4Gb/segment. • Program, data og stak kan være i forskellige segmenter. • Real-address mode: kompatibilitet med 8086. • Unix/Linux udnytter ikke muligheder for segmentering. • Derudover understøttes virtuel hukommelse og paging.
0xFFFFFFFF stack 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
Datatyper Numeriske datatyper: X X X X • Pointer datatyper: • Near pointer: 32 bit offset i segment. • Far pointer: 48 bit segment selector (16) og offset (32). • Bit fields: op til 32 bits • Strenge: sekvens af bit/bytes/ord.
Heltals datatyper Standard fortolkning: |W| 2-komplement fortolkning: |W|2
Instruktionsformat • Ved instruktioner med to operander er mindst en i register (REG). • Lokation af operander bestemmes ud fra: • SIB (Scale,Index,Base) og Displacement samt registre. • Immediate bruges til konstanter.
Addresseringsformer MOD (2 bit) og R/M (3 bit) specificerer formen: Displacement specificerer offset i 8 bit (MOD=01) / 32 bit (MOD=10). SIB: Scale * Index + Base (+Displacement)
register Based indexed Register indirekte Indexed Addresseringsformer MOD (2 bit) og R/M (3 bit) specificerer formen: Displacement specificerer offset i 8 bit (MOD=01) / 32 bit (MOD=10). SIB: Scale * Index + Base (+Displacement)
IA-32 Symbolsk Maskinsprog • Programmering i praksis i symbolsk maskinsprog. • Der findes mange assemblers til IA-32 maskinkode: • GAS • as86 • NASM ,… • Anvender forskellig syntax: • Intel Syntax • AT&T Syntax • GAS (GNU assembler, AT&T syntax) under Linux OS.
GAS – AT&T Syntax (1) • % bruges til at referere til registre: • %ebp, %esp, %eax, %ebx,… • $ bruges til konstanter (immediate addressing): • $42, $53, $0xff,… • Suffix på symbolske instruktioner giver størrelsen på operander: • b - byte (8 bit) • w - word (16 bit) • l - double word (32 bit)
GAS – AT&T Syntax (2) • Immediate, register addressing: • movl $42,%eax # eax = 42 • Direct addressing: • pushl ADDR # ADDR er en addresse • Register indirect addressing, register addressing: • movl (%ebp),%eax # eax = m[ebp] • Indexed addressing, register addressing: • movl 4(%ebp),%eax # eax = m[ebp+4]
C Program intmain (void) { long a = 42; long b = 53; long m = 0; if (a >= b) m = a; else m = b; exit(m); } %>gcc –o ex1 ex1.c %>./ex1 %>echo $? 53
IA-32 Symbolsk Maskinsprog (1) .section .data # start of data sectiona: .long 42 # the variable ab: .long 53 # the variable bm: .long 0 # the variable m.section .text # start of text section.globl_start # _start is a global symbol # specifies start of program
IA-32 Symbolsk Maskinsprog (2) _start: # int main (void) movl a,%eax # movl b,%ebx # cmpl %eax,%ebx # compute b-a <=0 and # set eflags jle if # if (a >= b) jmp else if: movl %eax,m # m = ajmp endif Else: movl %ebx,m # m = b endif: movl m,%ebx # put return value in %ebx movl $1,%eax # opcode for exit system call int $0x80 # exit(m) (%ebx) via exit
Oversættelse til maskinkode %>as –o ex2.o ex2.s %>objdump –D ex2.o 00000000 <_start>: 0: a1 00 00 00 00 mov 0x0,%eax 5: 8b 1d 04 00 00 00 mov 0x4,%ebx b: 39 c3 cmp %eax,%ebx d: 7e 02 jle 11 <if> f: eb 07 jmp 18 <else>00000011 <if>: 11: a3 08 00 00 00 mov %eax,0x8 16: eb 06 jmp 1e <endif>00000018 <else>: 18: 89 1d 08 00 00 00 mov %ebx,0x80000001e <endif>: 1e: 8b 1d 08 00 00 00 mov 0x8,%ebx 24: b8 01 00 00 00 mov $0x1,%eax 29: cd 80 int $0x80
Sammenkædning (Linkning) %>ld –o ex2 ex2.o %>objdump –d ex2 Disassembly of section .text:08048074 <_start>: 8048074: a1 a0 90 04 08 mov 0x80490a0,%eax 8048079: 8b 1d a4 90 04 08 mov 0x80490a4,%ebx 804807f: 39 c3 cmp %eax,%ebx 8048081: 7e 02 jle 8048085 <if> 8048083: eb 07 jmp 804808c <else>08048085 <if>: 8048085: a3 a8 90 04 08 mov %eax,0x80490a8 804808a: eb 06 jmp 8048092 <endif>0804808c <else>: 804808c: 89 1d a8 90 04 08 mov %ebx,0x80490a808048092 <endif>: 8048092: 8b 1d a8 90 04 08 mov 0x80490a8,%ebx 8048098: b8 01 00 00 00 mov $0x1,%eax 804809d: cd 80 int $0x80
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.
C kaldkonventionen • Læg parametre på stak i omvendt rækkefølge (caller). • Kald funktion via callinstruktionen (caller). • Etabler stakafsnit (manipulering af ebp og esp) (callee). • Gør plads til eventuelle lokale variable (callee). • Udfør kroppen af funktionen (callee). • Læg returværdi i eax registret (callee). • Nedlæg stakafsnit (manipulation af ebp og esp) (callee). • Returner fra kald via ret instruktionen (callee). • Fjern parametre fra stak (caller).
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 Funktioner 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
C Eksempel intmain (int argc, char *argv[]) {long a=0,b=0,m=0;a = atol(argv[1]);b = atol(argv[2]);if (a >= b) m = a;else m = b; exit(m); } %>./ex5 42 53
Initielt stakafsnit Etableres af operativsystemet jvf. kommandolinie argumenter: 0x00000000 argN arg1 program navn esp #argumenter %>foo arg1 … argN
Eksempel IA-32 .section .data a: .long 0 b: .long 0 m: .long 0 .section .text .globl _start _start: # int main (void) pushl 8(%esp) call atol addl $4, %esp movl %eax,a # a = atol(argv[1]) pushl 12(%esp) call atol addl $4, %esp movl %eax,b # b = atol(argv[2]) movl a,%eax movl b,%ebx
Input/Output intmain (int argc, char *argv[]){long a=0,b=0,m=0; a = atol(argv[1]); b = atol(argv[2]);if (a >= b) m = a;else m = b;printf("max(%ld,%ld) = %ld\n",a,b,m);exit(0);} Standard biblioteker kan også bruges til input/output:
Eksempel IA-32 .section .data a: .long 0 b: .long 0 m: .long 0 formatstr: .ascii "max(%ld,%ld) = %ld\n\0" .section .text .globl _start _start: # int main (void) pushl 8(%esp) # call atol # addl $4, %esp # movl %eax,a # a = atol(argv[1]) …
Eksempel IA-32 … endif: pushl m #maximum in m pushl b pushl a pushl $formatstr # addr of formatstr call printf # printf("max(%ld,%ld) = %ld\n",a,b,m); addl $16, %esp movl $0,%ebx # movl $1,%eax # int $0x80 # exit(0)
Returning Foregår via systemkald implementeret af operativsystemet: endif: pushl m # maximum in m pushl b pushl a pushl $formatstr # addr of formatstr call printf # printf("max(%ld,%ld) = %ld\n",a,b,m); addl $16, %esp movl $0,%ebx # put return value in %ebx movl $1,%eax # opcode for exit system int $0x80 # exit(0)
Operativsystemets funktioner Adminstrere maskinens resourcer for programmer: Process administration (process begreb og schedulering). Lager administration (virtuel hukommelse og addresserum). Filsystem (filer og directories). Administration af ydre enheder (input/output abstraktion). Service stilles til rådighed via systemkald.