1 / 61

Oversættelse af symbolsk maskinsprog Sammenkædning og indlæsning af maskinsprog

Oversættelse af symbolsk maskinsprog Sammenkædning og indlæsning af maskinsprog. 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.

barr
Download Presentation

Oversættelse af symbolsk maskinsprog Sammenkædning og indlæsning af maskinsprog

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Oversættelse af symbolsk maskinsprogSammenkæ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 Evt. optimeringer foretages altid på et korrekt program ... Tag udgangspunkt i et C program Oversæt systematisk til symbolsk maskinsprog Kommenter med C programmet Afprøv programmet eksternt og internt

  4. .method main // int main .args 3 // ( 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 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 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 // } • Hvilke opgaver har assembleren for at producere absolut maskinkode? 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

  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. .method main // int main .args 3 // ( 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 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 iflt else iload b // r = b; istore r gotoend_if else: // else iload a // r = a; istore r end_if: iload r // return r; ireturn // } Sekventieloversættelse main index: 0 method area: 40 bytes 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? 15 01 36 03 15 03 ac constant pool: 2 words 00000000 0000000e

  7. Two-pass assembler .method main // int main .args 3 // ( 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 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 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 // } 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 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

  8. Hvadskalasmholdestyrpå? Adressenpånæsteledige byte i method area: Instruction Location Counter Adressenpånæsteledigeword iconstant pool: Constant Location Counter Værdierknyttettilsymboler, konstanter, metodenavne, labels: Symboltabel .method main // int main .args 3 // ( 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 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 iflt else iload b // r = b; istore r gotoend_if else: // else iload a // r = a; istore r end_if: iload r // return r; ireturn // } 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

  9. 1. gennemløb ILC: 0 CLC: 0 .method main // int main .args 3 // ( 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 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 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 // } main index: method area: constant pool:

  10. 1. gennemløb ILC: 0 CLC: 1 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: constant pool: 00000000

  11. 1. gennemløb ILC: 4 CLC: 1 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 constant pool: 00000000

  12. 1. gennemløb ILC: 4 CLC: 1 .method main // int main .args 3 // ( 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 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 iflt else iload b // r = b; istore r gotoend_if else: // else iload a // r = a; istore r end_if: iload r // return r; ireturn // } main index: 0 method area: 00 03 00 00 constant pool: 00000000

  13. 1. gennemløb ILC: 4 CLC: 1 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 constant pool: 00000000

  14. 1. gennemløb ILC: 6 CLC: 1 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 constant pool: 00000000

  15. 1. gennemløb ILC: 8 CLC: 1 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 constant pool: 00000000

  16. 1. gennemløb ILC: 10 CLC: 1 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 constant pool: 00000000

  17. 1. gennemløb ILC: 13 CLC: 1 .method main // int main .args 3 // ( 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 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 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 // } Forward reference (minerikkeisymboltabellen) main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? constant pool: 00000000

  18. 1. gennemløb ILC: 14 CLC: 1 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac constant pool: 00000000

  19. 1. gennemløb ILC: 14 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac constant pool: 00000000 0000000e

  20. 1. gennemløb ILC: 18 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 constant pool: 00000000 0000000e

  21. 1. gennemløb ILC: 20 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 constant pool: 00000000 0000000e

  22. 1. gennemløb ILC: 22 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 constant pool: 00000000 0000000e

  23. 1. gennemløb ILC: 23 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 constant pool: 00000000 0000000e

  24. 1. gennemløb ILC: 26 CLC: 2 .method main // int main .args 3 // ( 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 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 iflt else iload b // r = b; istore r gotoend_if else: // else iload a // r = a; istore r end_if: iload r // return r; ireturn // } Forward reference (elseerikkedefineret) main index: 0 method area: 00 03 00 00 10 58 15 02 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? constant pool: 00000000 0000000e

  25. 1. gennemløb ILC: 28 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 constant pool: 00000000 0000000e

  26. 1. gennemløb ILC: 30 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 constant pool: 00000000 0000000e

  27. 1. gennemløb ILC: 33 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } Forward reference main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? constant pool: 00000000 0000000e

  28. 1. gennemløb ILC: 33 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? constant pool: 00000000 0000000e

  29. 1. gennemløb ILC: 35 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? 15 01 constant pool: 00000000 0000000e

  30. 1. gennemløb ILC: 37 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? 15 01 36 03 constant pool: 00000000 0000000e

  31. 1. gennemløb ILC: 37 CLC: 2 .method main // int main .args 3 // ( 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 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 iflt else iload b // r = b; istore r gotoend_if else: // else iload a // r = a; istore r end_if: iload r // return r; ireturn // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? 15 0136 03 constant pool: 00000000 0000000e

  32. 1. gennemløb ILC: 39 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? 15 0136 03 15 03 constant pool: 00000000 0000000e

  33. 1. gennemløb ILC: 40 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? 15 0136 03 15 03 ac constant pool: 00000000 0000000e

  34. 1. gennemløb ILC: 40 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } main index: 0 method area: 40 bytes 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? 15 0136 03 15 03 ac constant pool: 2 words 00000000 0000000e

  35. 2. gennemløb .method main // int main .args 3 // ( 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 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 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 // } Udfyld “huller” vha. symboltabel main index: 0 method area: 40 bytes 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? ac 00 03 00 01 15 01 15 02 64 9b ?? ?? 15 02 36 03 a7 ?? ?? 15 0136 03 15 03 ac constant pool: 2 words 00000000 0000000e

  36. 2. gennemløb ILC: 13 CLC: 1 .method main // int main .args 3 // ( 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 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 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 // } 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 ?? ?? 15 02 36 03 a7 ?? ?? 15 0136 03 15 03 ac constant pool: 2 words 00000000 0000000e

  37. 2. gennemløb ILC: 26 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } Relativt hop: 33-23 = 10 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 ?? ?? 15 0136 03 15 03 ac constant pool: 2 words 00000000 0000000e 23

  38. 2. gennemløb ILC: 33 CLC: 2 .method main // int main .args 3 // ( 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 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 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 // } Relativt hop: 37-30 = 7 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 0136 03 15 03 ac constant pool: 2 words 00000000 0000000e 30

  39. Two-pass assembler .method main // int main .args 3 // ( 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 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 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 // } 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 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

  40. Opgave m. side”mand”: Lavsymboltabel for følgende program // 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 .define a = 1 .define b = 2 bipush 88 iload a iload b invokevirtualimul ldc_w 42 iadd ireturn // return a*b+42 // Integer multiplication. .method imul .args 3 // ( int x, int y ) .define x = 1 .define y = 2 .locals 1 // int p; .define p = 3 ldc_w 0 istore p // p = 0; while: // while iload x ifeqend_while // ( x > 0 ) // { iload x 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;

  41. Indlæsning af IJVM program PC = 0 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 00 00 00 00 00 00 00 0e 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ..... 64 Maskinsprog / binært program 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 Simpeltindlæseprogram • Indlæsbinært program i lager (method area og constant pool) startendefraadresse 0 • Initialiserkontrolregistre PC, CPP, LV og SP • Start afvikling; invokevirtual ''main index'' CPP = 10 LV = 12 SP = 16

  42. ijvmtest.bc 42 87 IJVM Trace of test.bc stack = 0, 1, 87, 42, 15 bipush 88 [10 58] stack = 88, 0, 1, 87, 42, 15 iload 1 [15 01] stack = 42, 88, 0, 1, 87, 42, 15 iload 2 [15 02] stack = 87, 42, 88, 0, 1, 87, 42, 15 invokevirtual 1 [b6 00 01] stack = 12, 13, 0, 87, 42, 21, 0, 1 iload 1 [15 01] stack = 42, 12, 13, 0, 87, 42, 21, 0 iload 2 [15 02] stack = 87, 42, 12, 13, 0, 87, 42, 21 isub [64] stack = -45, 12, 13, 0, 87, 42, 21, 0 iflt 10 [9b 00 0a] stack = 12, 13, 0, 87, 42, 21, 0, 1 iload 1 [15 01] stack = 42, 12, 13, 0, 87, 42, 21, 0 istore 3 [36 03] stack = 12, 13, 42, 87, 42, 21, 0, 1 iload 3 [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 SP Caller's LV: 0 Caller's PC: 1 b: 87 a: 42 Link prt: 15 15 +2 +1 12 LV Hvordan ser indholdetaflageretudvedprogramstart?

  43. Store programmer Man vilgerneanvende''biblioteksmetoder'' ... // Integer multiplication. .method imul .args 3 // ( int x, int y ) .define x = 1 .define y = 2 .locals 1 // int p; .define p = 3 ldc_w 0 istore p // p = 0; while: // while iload x ifeqend_while // ( x > 0 ) // { iload x 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 .define a = 1 .define b = 2 bipush 88 iload a iload b invokevirtualimul ldc_w 42 iadd ireturn // return a*b+42

  44. // Integer multiplication .method imul .args 3 // ( int x, int y ) .define x = 1 .define y = 2 .locals 1 // 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 .define a = 1 .define b = 2 bipush 88 iload a iload b invokevirtual imul ldc_w 42 iadd ireturn // return a*b+42 Muligløsning Lav et samlet program isymbolskmaskinsprog, derkanoversættes ... main index: 1 method area: 66 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac 00 03 00 00 10 58 15 01 15 02 b6 00 02 ac 00 03 00 00 10 58 15 01 15 02 b6 00 00 13 00 03 60 ac constant pool: 4 words 00000000 00000022 00000030 0000002a Muligløsning Sammenkæd den oversatttekode, maskinkoden, indenindlæsning ... Problemer Kræveradgangtilkildeteksten for de anvendtebiblioteksmetoder... Biblioteksmetoderskaloversætteshver gang derrettesiegenkode ...

  45. Sammenkædning Sammenkæd den oversattekode, maskinkoden, indenindlæsning ... main index: 0 method area: 32 bytes 00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? 13 00 02 60 ac constant pool: 3 words 00000000 0000000e 0000002a main index: ?? method area: 34 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac constant pool: 1 words 00000000 Mangler ''imul'' Har ingen main-metode

  46. Sammenkædning Sammenkæd den oversattekode, maskinkoden, indenindlæsning ... main index: 0 method area: 32 bytes 00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? 13 00 02 60 ac constant pool: 3 words 00000000 0000000e 0000002a main index: ?? method area: 34 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac constant pool: 1 words 00000000 Mangler ''imul'' Haringen main-metode main index: 0 calc index: 1 method area: 32 bytes 00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? 13 00 02 60 ac constant pool: 3 words 00000000 [.method main] 0000000e [.method calc] 0000002a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac constant pool: 1 words 00000000 [ldc_w constant] 00000000 [.method imul] main.obj imul.obj

  47. Sammenkædning main.obj imul.obj main index: 0 calc index: 1 method area: 32 bytes 00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? 13 00 02 60 ac constant pool: 3 words 00000000 [.method main] 0000000e [.method calc] 0000002a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac constant pool: 1 words 00000000 [ldc_w constant] 00000000 [.method imul] Linker main index: 1 method area: 66 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac 00 03 00 00 10 58 15 01 15 02 b6 00 02 ac 00 03 00 00 10 58 15 01 15 02 b6 00 00 13 00 03 60 ac constant pool: 4 words 00000000 00000022 00000030 0000002a all.bc

  48. Sammenkædning main.obj imul.obj main index: 0 calc index: 1 method area: 32 bytes 00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? 13 00 02 60 ac constant pool: 3 words 00000000 [.method main] 0000000e [.method calc] 0000002a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac constant pool: 1 words 00000000 [ldc_w constant] 00000000 [.method imul] Linker main index: 1 method area: 66 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac 00 03 00 00 10 58 15 01 15 02 b6 00 02 ac 00 03 00 00 10 58 15 01 15 02 b6 00 00 13 00 03 60 ac constant pool: 4 words 00000000 00000022 00000030 0000002a all.bc

  49. Sammenkædning main.obj imul.obj main index: 0 calc index: 1 method area: 32 bytes 00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 03 00 00 10 58 15 01 15 02 b6 ?? ?? 13 00 02 60 ac constant pool: 3 words 00000000 [.method main] 0000000e [.method calc] 0000002a [ldc_w constant] external symbols: .method imul [ 24: invokevirtual imul ] imul index: 1 method area: 34 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac constant pool: 1 words 00000000 [ldc_w constant] 00000000 [.method imul] Linker main index: 1 method area: 66 bytes 00 03 00 01 13 00 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac 00 03 00 00 10 58 15 01 15 02 b6 00 02 ac 00 03 00 00 10 58 15 01 15 02 b6 00 00 13 00 03 60 ac constant pool: 4 words 00000000 00000022 00000030 0000002a Hvordan? all.bc

  50. Generelt eksempel Fire objekt-moduler skal sammenkædes Hveroversat under antagelseafindlæsningfraadresse 0 ...

More Related