Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Niveauer af abstrakte maskiner

Lignende præsentationer


Præsentationer af emnet: "Niveauer af abstrakte maskiner"— Præsentationens transcript:

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'' ...


Download ppt "Niveauer af abstrakte maskiner"

Lignende præsentationer


Annoncer fra Google