170 likes | 292 Views
ISA-niveauet (2). Niveauer af virtuelle maskiner. ISA niveauet / maskin kodeniveauet / maskinniveau. ISA - Fra sidst. ISA-niveauet og von-Neumann maskine: Maskininstruktioner og instruktionsformat. Absolut maskinkode. Registre og lagermodellen. IJVM maskinen: Registre: PC, SP, LV, CPP.
E N D
ISA-niveauet (2) dComNet
Niveauer af virtuelle maskiner ISA niveauet / maskinkodeniveauet / maskinniveau dComNet
ISA - Fra sidst ISA-niveauet og von-Neumann maskine: Maskininstruktioner og instruktionsformat. Absolut maskinkode. Registre og lagermodellen. IJVM maskinen: Registre: PC, SP, LV, CPP. Lagermodel: method area, constant pool, stakken. Metodekald og stakafsnit, parametre og lokale variable. IJVM simulatoren dComNet
32 bit 32 bit 8 bit IJVM Lagermodel Opdelt i tre områder (konstant pool, stakken, method area): .. indlejret i et lineært lager: 4.294.967.296 celler (1 byte/celle). dComNet
IJVM registre Program Counter (PC): 32-bit register Udpeger aktuel instruktion (byte) i method area. Constant Pool Pointer:32-bit register Udpeger bunden (word) af konstant pool i lageret Stack Pointer (SP) :32-bit register Udpeger øverste element (word) på stakken. Local Variable Frame Pointer (LV):32-bit register Udpeger bunden (word) af det aktuelle stakafsnit. dComNet
invokevirtual dComNet
ireturn dComNet
Eksempel .method main bipush 88 bipush 2 invokevirtual test ireturn .method test .args 2 .define x=1 iload x bipush 1 isub ireturn • Lad os nu se hvorfor det var 1 dComNet
test.c int min(int a, int b) { int r; if (a>=b) r=b; else r=a; return r; } int main(int a, int b) { return min(a,b); } dComNet
test.j .method main // int main .args 3 // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 // Push object reference. iload a iload b invokevirtual min ireturn // return min ( a, b ); // } dComNet
.method min // int min .args 3 // ( int a, int b ){ .define a = 1 .define b = 2 .locals 1 // int r; .define r = 3 iload a // if ( a >= b ) iload b isub // stack = a - b, ... ; a - b < 0 => a < b iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; istore r end_if: iload r // return r; ireturn // } dComNet
Test.c oversættes til ”by hand” (næste time) test.j oversættes til ijvm-asm test.j test.bc main index: 0 method area: 40 bytes 00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 03 00 01 15 01 15 02 64 9b 00 0a 15 02 36 03 a7 00 07 15 01 36 03 15 03 ac constant pool: 2 words 00000000 0000000e fortolkes af ijvm test.bc 77 43 IJVM simulator dComNet
Antal argumenter for main Antal lokale variable for main Start adresse for main Start adresse for min main index: 0 method area: 40 bytes 0 00 03 2 00 00 4 10 58 bipush 88 6 15 01 iload 1 8 15 02 iload 2 10 b6 00 01 invokevirtual 1 13 ac ireturn 14 00 03 16 00 01 18 15 01 iload 1 20 15 02 iload 2 22 64 isub 23 9b 00 0a iflt 10 26 15 02 iload 2 28 36 03 istore 3 30 a7 00 07 goto 7 33 15 01 iload 1 35 36 03 istore 3 37 15 03 iload 3 39 ac ireturn constant pool: 2 words 00000000 0000000e dComNet
ijvm test.bc 77 43 IJVM Trace of foo stack = 0, 1, 43, 77, 15 bipush 88 [10 58] stack = 88, 0, 1, 43, 77, 15 iload 1 [15 01] stack = 77, 88, 0, 1, 43, 77, 15 iload 2 [15 02] stack = 43, 77, 88, 0, 1, 43, 77, 15 invokevirtual 1 [b6 00 01] stack = 12, 13, 0, 43, 77, 21, 0, 1 iload 1 [15 01] stack = 77, 12, 13, 0, 43, 77, 21, 0 iload 2 [15 02] stack = 43, 77, 12, 13, 0, 43, 77, 21 isub [64] stack = 34, 12, 13, 0, 43, 77, 21, 0 iflt 10 [9b 00 0a] stack = 12, 13, 0, 43, 77, 21, 0, 1 iload 2 [15 02] stack = 43, 12, 13, 0, 43, 77, 21, 0 istore 3 [36 03] stack = 12, 13, 43, 43, 77, 21, 0, 1 goto 7 [a7 00 07] stack = 12, 13, 43, 43, 77, 21, 0, 1 iload 3 [15 03] stack = 43, 12, 13, 43, 43, 77, 21, 0 ireturn [ac] stack = 43, 0, 1, 43, 77, 15 ireturn [ac] stack = 43 return value: 43 dComNet
IJVM Maskinarkitekturen Instruktionssæt: 20 instruktioner. Instruktionsformat: 1-5 bytes længde og 1 byte opkode. Datatyper:heltal (med og uden fortegn) Lagermodel: 3-delt 4Gb lineært lager. Stakmaskine: operander udpeges ved stak addressering. dComNet
Pause opgave (1) .method main bipush 88 bipush 2 invokevirtual test ireturn .method test .args 2 .define x=1 iload x bipush 1 isub ifeq end bipush 88 iload x bipush 1 isub invokevirtual test end: ireturn • Skriv de instruktioner som udføres: dComNet
Pause opgave stack = 0, 1, 12 bipush 88 stack = 88, 0, 1, 12 bipush 2 stack = 2, 88, 0, 1, 12 invokevirtual 1 stack = 11, 11, 2, 16, 0, 1, 12 iload 1 stack = 2, 11, 11, 2, 16, 0, 1, 12 bipush 1 stack = 1, 2, 11, 11, 2, 16, 0, 1, 12 isub stack = 1, 11, 11, 2, 16, 0, 1, 12 ifeq 13 stack = 11, 11, 2, 16, 0, 1, 12 bipush 88 stack = 88, 11, 11, 2, 16, 0, 1, 12 iload 1 stack = 2, 88, 11, 11, 2, 16, 0, 1, 12 bipush 1 stack = 1, 2, 88, 11, 11, 2, 16, 0, 1, 12 isub stack = 1, 88, 11, 11, 2, 16, 0, 1, 12 invokevirtual 1 stack = 14, 34, 1, 20, 11, 11, 2, 16, 0, 1, 12 iload 1 stack = 1, 14, 34, 1, 20, 11, 11, 2, 16, 0, 1, 12 bipush 1 stack = 1, 1, 14, 34, 1, 20, 11, 11, 2, 16, 0, 1, 12 isub stack = 0, 14, 34, 1, 20, 11, 11, 2, 16, 0, 1, 12 ifeq 13 stack = 14, 34, 1, 20, 11, 11, 2, 16, 0, 1, 12 ireturn stack = 14, 11, 11, 2, 16, 0, 1, 12 ireturn stack = 14, 0, 1, 12 ireturn stack = 14 return value: 14 • Hvorfor ser stakken sådan ud? dComNet