Download præsentationen
Præsentation er lastning. Vent venligst
1
Oversættelse af symbolsk maskinsprog Sammenkædning og indlæsning af maskinsprog
2
Niveauer af abstrakte maskiner
Spørgsmål ... Hvordan bruges asm-niveauet? metode til programmering Hvordan stilles asm-niveauet tilrådighed? oversættelse af symbolsk maskinsprog til absolut maskinsprog
3
Programmering i symbolsk maskinsprog
Tag udgangspunkt i et C program Oversæt systematisk til symbolsk maskinsprog Kommenter med C programmet Afprøv programmet eksternt og internt Konklusion fra sidst Evt. optimeringer foretages altid på et korrekt program ...
4
Hvilke opgaver har assembleren for at producere absolut maskinkode?
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Hvilke opgaver har assembleren for at producere absolut maskinkode? main index: 0 method area: 40 bytes b ac 00 03 b 00 0a a7 00 ac constant pool: 2 words e Skriv opgaverne på tavlen Oversættelse af symbolske navne for instruktioner Oversætte symbolske navne til absolutte - adresser på kode - konstanter - lokale variabler Oprette konstantpool
5
Oversættelse af symbolsk maskinsprog
1-1 afbildning mellem maskinordre og symbolsk maskinordre Oversættelse er vel ligetil? Hvad med symbolske konstanter, labels og direktiver?
6
Sekventiel oversættelse
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Sekventiel oversættelse main index: 0 method area: 40 bytes b6 ?? ?? ac b ?? ?? a7 ?? ?? ac constant pool: 2 words e Adresser kan ligge længere fremme i koden – derfor kan de ikke vides når der skal genereres kode
7
oversættelse af program ordre for ordre ...
Two-pass assembler .method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } ijvm-asm test.j test.bc 1. gennemløb Opbyg symboltabel Sammenknytning af symbolske navne og værdier ... 2. gennemløb oversættelse af program ordre for ordre ... main index: 0 method area: 40 bytes b ac 00 03 b 00 0a a7 00 ac constant pool: 2 words e
8
Hvad skal asm holde styr på?
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Adressen på næste ledige byte i method area: Instruction Location Counter Adressen på næste ledige word i constant pool: Constant Location Counter Værdier knyttet til symboler, konstanter, metodenavne, labels: Symboltabel main index: 0 method area: 40 bytes b ac 00 03 b 00 0a a7 00 ac constant pool: 2 words e
9
1. gennemløb ILC: 0 CLC: 0 Symbol værdi type .method main // int main
.args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type main index: method area: constant pool:
10
1. gennemløb ILC: 0 CLC: 1 Symbol værdi type main metode
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type main metode main index: 0 method area: constant pool:
11
1. gennemløb ILC: 4 CLC: 1 Symbol værdi type main metode
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type main metode main index: 0 method area: constant pool:
12
1. gennemløb ILC: 4 CLC: 1 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant main index: 0 method area: constant pool:
13
1. gennemløb ILC: 4 CLC: 1 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 main index: 0 method area: constant pool:
14
1. gennemløb ILC: 6 CLC: 1 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 main index: 0 method area: constant pool:
15
1. gennemløb ILC: 8 CLC: 1 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 main index: 0 method area: constant pool:
16
1. gennemløb ILC: 10 CLC: 1 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 main index: 0 method area: constant pool:
17
1. gennemløb Forward reference (min er ikke i symboltabellen) ILC: 13
CLC: 1 .method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 Forward reference (min er ikke i symboltabellen) main index: 0 method area: b6 ?? ?? constant pool:
18
1. gennemløb ILC: 14 CLC: 1 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 main index: 0 method area: b6 ?? ?? ac constant pool:
19
1. gennemløb ILC: 14 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min main index: 0 method area: b6 ?? ?? ac constant pool: e
20
1. gennemløb ILC: 18 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 main index: 0 method area: b6 ?? ?? ac 00 03 00 01 constant pool: e
21
1. gennemløb ILC: 20 CLC: 2 Vigtigt med scope (to a’er) Symbol værdi
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 Symbol værdi type scope main metode a 1 konstant b 2 min Vigtigt med scope (to a’er) main index: 0 method area: b6 ?? ?? ac 00 03 constant pool: e
22
1. gennemløb ILC: 22 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min Symbol værdi type scope main metode a 1 konstant b 2 min r 3 main index: 0 method area: b6 ?? ?? ac 00 03 constant pool: e
23
1. gennemløb ILC: 23 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min Symbol værdi type scope main metode a 1 konstant b 2 min r 3 main index: 0 method area: b6 ?? ?? ac 00 03 constant pool: e
24
1. gennemløb Forward reference (else er ikke defineret) ILC: 26 CLC: 2
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 Symbol værdi type scope main metode a 1 konstant b 2 min Forward reference (else er ikke defineret) main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? constant pool: e
25
1. gennemløb ILC: 28 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min Symbol værdi type scope main metode a 1 konstant b 2 min r 3 main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? 15 02 constant pool: e
26
1. gennemløb ILC: 30 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? constant pool: e
27
1. gennemløb Forward reference ILC: 33 CLC: 2 Symbol værdi type scope
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 Forward reference main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? a7 ?? ?? constant pool: e
28
1. gennemløb ILC: 33 CLC: 2 Hvorfor er else 33? Symbol værdi type
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label Hvorfor er else 33? main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? a7 ?? ?? constant pool: e
29
1. gennemløb ILC: 35 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? a7 ?? ?? 15 01 constant pool: e
30
1. gennemløb ILC: 37 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? a7 ?? ?? constant pool: e
31
1. gennemløb ILC: 37 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label end_if 37 main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? a7 ?? ?? constant pool: e
32
1. gennemløb ILC: 39 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label end_if 37 main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? a7 ?? ?? constant pool: e
33
1. gennemløb ILC: 40 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label end_if 37 main index: 0 method area: b6 ?? ?? ac 00 03 b ?? ?? a7 ?? ?? ac constant pool: e
34
1. gennemløb ILC: 40 CLC: 2 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label end_if 37 main index: 0 method area: 40 bytes b6 ?? ?? ac 00 03 b ?? ?? a7 ?? ?? ac constant pool: 2 words e
35
2. gennemløb Udfyld “huller” vha. symboltabel Symbol værdi type scope
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label end_if 37 Udfyld “huller” vha. symboltabel main index: 0 method area: 40 bytes b6 ?? ?? ac 00 03 b ?? ?? a7 ?? ?? ac constant pool: 2 words e
36
2. gennemløb ILC: 13 CLC: 1 Symbol værdi type scope main metode a 1
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label end_if 37 main index: 0 method area: 40 bytes b ac 00 03 b ?? ?? a7 ?? ?? ac constant pool: 2 words e
37
2. gennemløb Relativt hop: 33-23 = 10 23 ILC: 26 CLC: 2
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label end_if 37 Hvordan er det iflt virker? Hvordan udregnes adressen? Relativt hop: = 10 main index: 0 method area: 40 bytes b ac 00 03 b 00 0a a7 ?? ?? ac constant pool: 2 words e 23
38
2. gennemløb Relativt hop: 37-30 = 7 30 ILC: 33 CLC: 2 Symbol værdi
.method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } Symbol værdi type scope main metode a 1 konstant b 2 min r 3 else 33 label end_if 37 Relativt hop: = 7 main index: 0 method area: 40 bytes b ac 00 03 b 00 0a a7 00 ac constant pool: 2 words e 30
39
oversættelse af program ordre for ordre ...
Two-pass assembler .method main // int main .args // ( int a, int b ) .define a = 1 .define b = 2 // { bipush 88 iload a iload b invokevirtual min ireturn // return min ( a, b ); // } .method min // int min .args // ( int a, int b ){ .locals // int r; .define r = 3 iload a // if ( a >= b ) isub iflt else iload b // r = b; istore r goto end_if else: // else iload a // r = a; end_if: iload r // return r; ireturn // } ijvm-asm test.j test.bc 1. gennemløb Opbyg symboltabel Sammenknytning af symbolske navne og værdier ... 2. gennemløb oversættelse af program ordre for ordre ... main index: 0 method area: 40 bytes b ac 00 03 b 00 0a a7 00 ac constant pool: 2 words e
40
Opgave m. side”mand”: Lav symboltabel for følgende program
// Integer multiplication. .method imul .args // ( int x, int y ) .define x = 1 .define y = 2 .locals // int p; .define p = 3 ldc_w 0 istore p // p = 0; while: // while iload x ifeq end_while // ( x > 0 ) // { bipush 1 isub istore x // x = x - 1; iload p iload y iadd istore p // p = p + y; goto while // } end_while: iload p ireturn // return p; // My multiplication program .method main .args 3 .define a = 1 .define b = 2 bipush 88 iload a iload b invokevirtual calc ireturn .method calc .args 3 invokevirtual imul ldc_w 42 ireturn // return a*b+42
41
Indlæsning af IJVM program
00 03 10 58 15 01 02 b6 ac 64 9b 0a 36 a7 07 0e PC = 0 CPP = 10 SP = 16 LV = 12 04 05 06 08 09 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 38 39 40 41 42 43 44 45 46 47 ..... main index: 0 method area: 40 bytes b ac 00 03 b 00 0a a7 00 ac constant pool: 2 words e Maskinsprog / binært program Indlæs binært program i lager (method area og constant pool) startende fra adresse 0 Initialiser kontrolregistre PC, CPP, LV og SP Start afvikling; invokevirtual ''main index'' Simpelt indlæseprogram Hvorfor er CPP 10, LV=12 og SP = 16? Det er pointere til ORD (á 4 byte) alligned
42
Hvordan ser indholdet af lageret ud ved programstart?
ijvm test.bc 42 87 IJVM Trace of test.bc stack = 0, 1, 87, 42, 15 bipush [10 58] stack = 88, 0, 1, 87, 42, 15 iload [15 01] stack = 42, 88, 0, 1, 87, 42, 15 iload [15 02] stack = 87, 42, 88, 0, 1, 87, 42, 15 invokevirtual [b ] stack = 12, 13, 0, 87, 42, 21, 0, 1 iload [15 01] stack = 42, 12, 13, 0, 87, 42, 21, 0 iload [15 02] stack = 87, 42, 12, 13, 0, 87, 42, 21 isub [64] stack = -45, 12, 13, 0, 87, 42, 21, 0 iflt [9b 00 0a] stack = 12, 13, 0, 87, 42, 21, 0, 1 istore [36 03] stack = 12, 13, 42, 87, 42, 21, 0, 1 iload [15 03] stack = 42, 12, 13, 42, 87, 42, 21, 0 ireturn [ac] stack = 42, 0, 1, 87, 42, 15 ireturn [ac] stack = 42 return value: 42 Caller's LV: 0 Caller's PC: 1 b: 87 a: 42 Link prt: 15 SP LV +2 +1 15 12 Hvordan ser indholdet af lageret ud ved programstart?
43
Store programmer Man vil gerne anvende ''biblioteksmetoder'' ...
// Integer multiplication. .method imul .args // ( int x, int y ) .define x = 1 .define y = 2 .locals // int p; .define p = 3 ldc_w 0 istore p // p = 0; while: // while iload x ifeq end_while // ( x > 0 ) // { bipush 1 isub istore x // x = x - 1; iload p iload y iadd istore p // p = p + y; goto while // } end_while: iload p ireturn // return p; // My multiplication program .method main .args 3 .define a = 1 .define b = 2 bipush 88 iload a iload b invokevirtual calc ireturn .method calc .args 3 invokevirtual imul ldc_w 42 ireturn // return a*b+42
44
Mulig løsning Mulig løsning Problemer
// Integer multiplication .method imul .args // ( int x, int y ) .define x = 1 .define y = 2 .locals // int p; .define p = 3 ldc_w 0 istore p // p = 0; ... // My multiplication program .method main .args 3 .define a = 1 .define b = 2 bipush 88 iload a iload b invokevirtual calc ireturn .method calc .args 3 invokevirtual imul ldc_w 42 iadd ireturn // return a*b+42 Mulig løsning Lav et samlet program i symbolsk maskinsprog, der kan oversættes ... main index: 1 method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a Mulig løsning Sammenkæd den oversattte kode, maskinkoden, inden indlæsning ... Problemer Kræver adgang til kildeteksten for de anvendte biblioteksmetoder... Biblioteksmetoder skal oversættes hver gang der rettes i egen kode ...
45
Sammenkæd den oversatte kode, maskinkoden, inden indlæsning ...
Sammenkædning Sammenkæd den oversatte kode, maskinkoden, inden indlæsning ... main index: 0 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words e a main index: ?? method area: 34 bytes a7 ff ed 15 03 ac constant pool: 1 words Mangler ''imul'' Har ingen main-metode
46
Sammenkæd den oversatte kode, maskinkoden, inden indlæsning ...
Sammenkædning Sammenkæd den oversatte kode, maskinkoden, inden indlæsning ... main index: 0 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words e a main index: ?? method area: 34 bytes a7 ff ed 15 03 ac constant pool: 1 words Mangler ''imul'' Har ingen main-metode main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes a7 ff ed 15 03 ac constant pool: 1 words [ldc_w constant] [.method imul] main.obj imul.obj
47
Sammenkædning main.obj imul.obj Linker all.bc main index: 1
method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul]
48
Sammenkædning main.obj imul.obj Linker all.bc main index: 1
method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul]
49
Sammenkædning main.obj imul.obj Linker all.bc Hvordan? main index: 1
method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul] Hvordan?
50
Generelt eksempel Fire objekt-moduler skal sammenkædes
Hver oversat under antagelse af indlæsning fra adresse 0 ...
51
Reallokeringsproblem
Absolutte referencer til lageradresse skal justeres jvf. indlæsningsadresser ... Eksterne referencer Skal sættes jvf. indlæsnings-adresser ...
52
IJVM eksempel Linker all.bc main index: 1 method area: 66 bytes
a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul]
53
IJVM eksempel Linker all.bc main index: 1 method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul] Eksterne referencer sættes jvf. placering i fælles ''method area'' og ''constant pool'' ...
54
IJVM eksempel Linker all.bc main index: 1 method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul] Startadresser for metoder i eget ''method area'' skal justeres i fælles ''constant pool'' jvf. placering i fælles ''method area'' ...
55
IJVM eksempel Linker all.bc main index: 1 method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul] Startadresser for metoder i eget ''method area'' skal justeres i fælles ''constant pool'' jvf. placering i fælles ''method area'' ... adresse 34
56
IJVM eksempel Linker all.bc main index: 1 method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul] Referencer til egen ''constant pool'' (via invokevirtual eller ldc_w) skal justeres jvf. placering i fælles ''constant pool'' ...
57
IJVM eksempel Linker all.bc main index: 1 method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul] Referencer til egen ''constant pool'' (via invokevirtual eller ldc_w) skal justeres jvf. placering i fælles ''constant pool'' ... adresse 1
58
IJVM eksempel Linker all.bc main index: 1 method area: 66 bytes a7 ff ed 15 03 ac b ac b 60 ac constant pool: 4 words a main index: 0 calc index: 1 method area: 32 bytes b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 03 ac constant pool: 1 words [ldc_w constant] [.method imul] relocation dictionary: [10: invokevirtual] [27: ldc_w] Referencer til egen ''constant pool'' (via invokevirtual eller ldc_w) skal justeres jvf. placering i fælles ''constant pool'' ... adresse 1
59
Opsummering main index: 0 calc index: 1 method area: 32 bytes
b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] relocation dictionary: [10: invokevirtual] [27: ldc_w]
60
Opsummering main index: 0 calc index: 1 method area: 32 bytes
b ac 00 03 b6 ?? ?? ac constant pool: 3 words [.method main] e [.method calc] a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] relocation dictionary: [10: invokevirtual] [27: ldc_w]
61
Opsummering Egentlig en diskussion af bindingstidspunkt, dvs. hvornår bindes referencer til lageret til fysiske adresse ... Når programmet skrives Når programmet oversættes Når programmet sammenkædes Når programmet indlæses ... ijvm-asm eksempel ... et samspil med operativ-systemets ''memory manager'' ...
Lignende præsentationer
© 2024 SlidePlayer.dk Inc.
All rights reserved.