symbolsk maskinsprog

40
Symbolsk maskinsprog

Upload: lihua

Post on 15-Jan-2016

25 views

Category:

Documents


0 download

DESCRIPTION

Symbolsk maskinsprog. Niveauer af abstrakte maskiner. Spørgsmål ... Hvordan bruges asm-niveauet? metode til programmering (i dag) Hvordan stilles asm-niveauet tilrådighed? oversættelse af symbolsk maskinsprog til absolut maskinsprog (næste gang). Symbolsk maskinsprog. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Symbolsk maskinsprog

Symbolsk maskinsprog

Page 2: Symbolsk maskinsprog

Niveauer af abstrakte maskiner

Spørgsmål ...

Hvordan bruges asm-niveauet?

metode til programmering (i dag)

Hvordan stilles asm-niveauet tilrådighed?

oversættelse af symbolsk maskinsprogtil absolut maskinsprog (næste gang)

Page 3: Symbolsk maskinsprog

.method main // int main

.args 3 // ( int a, int b )

.define a = 1

.define b = 2 // { bipush 88 // Push object reference. iload a iload b invokevirtual min ireturn // return min ( a, b ); // }

.method min // int min

.args 3 // ( int a, int b ){

.define a = 1

.define b = 2

.locals 1 // int r;

.define r = 3

iload a // if ( a >= b ) iload b isub

// stack = a - b, ... ; a - b < 0 => a < b

iflt else

iload b // r = b; istore r goto end_if

else: // else iload a // r = a; istore r

end_if: iload r // return r; ireturn

// }

main index: 0method area: 40 bytes00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 0300 01 15 01 15 02 64 9b 00 0a 15 02 36 03 a7 0007 15 01 36 03 15 03 acconstant pool: 2 words000000000000000e

Maskinsprog

Symbolsk maskinsprog

Page 4: Symbolsk maskinsprog

.method main // int main

.args 3 // ( int a, int b )

.define a = 1

.define b = 2 // { bipush 88 // Push object reference. iload a iload b invokevirtual min ireturn // return min ( a, b ); // }

.method min // int min

.args 3 // ( int a, int b ){

.define a = 1

.define b = 2

.locals 1 // int r;

.define r = 3

iload a // if ( a >= b ) iload b isub

// stack = a - b, ... ; a - b < 0 => a < b

iflt else

iload b // r = b; istore r goto end_if

else: // else iload a // r = a; istore r

end_if: iload r // return r; ireturn

// }

Symbolsk maskinsprogSymbolske ordrer

1-1 afbildning mellem maskinordre og symbolsk maskinordre

Page 5: Symbolsk maskinsprog

.method main // int main

.args 3 // ( int a, int b )

.define a = 1

.define b = 2 // { bipush 88 // Push object reference. iload a iload b invokevirtual min ireturn // return min ( a, b ); // }

.method min // int min

.args 3 // ( int a, int b ){

.define a = 1

.define b = 2

.locals 1 // int r;

.define r = 3

iload a // if ( a >= b ) iload b isub

// stack = a - b, ... ; a - b < 0 => a < b

iflt else

iload b // r = b; istore r goto end_if

else: // else iload a // r = a; istore r

end_if: iload r // return r; ireturn

// }

main index: 0method area: 40 bytes00 03 00 00 10 58 15 01 15 02 b6 00 01 ac 00 0300 01 15 01 15 02 64 9b 00 0a 15 02 36 03 a7 0007 15 01 36 03 15 03 acconstant pool: 2 words000000000000000e

Maskinsprog

Hvor finder du bipush 88 ?

?

Page 6: Symbolsk maskinsprog

.method main // int main

.args 3 // ( int a, int b )

.define a = 1

.define b = 2 // { bipush 88 // Push object reference. iload a iload b invokevirtual min ireturn // return min ( a, b ); // }

.method min // int min

.args 3 // ( int a, int b ){

.define a = 1

.define b = 2

.locals 1 // int r;

.define r = 3

iload a // if ( a >= b ) iload b isub

// stack = a - b, ... ; a - b < 0 => a < b

iflt else

iload b // r = b; istore r goto end_if

else: // else iload a // r = a; istore r

end_if: iload r // return r; ireturn

// }

Symbolsk maskinsprogSymbolske ordrer

bipush, iload 1-1 afbildning

Direktiver/pseudoinstruktioner.define a=1 symbolsk konstant.method min metode start.args 3 antal argumenter.locals 1 antal lokale variable

Page 7: Symbolsk maskinsprog

.method main // int main

.args 3 // ( int a, int b )

.define a = 1

.define b = 2 // { bipush 88 // Push object reference. iload a iload b invokevirtual min ireturn // return min ( a, b ); // }

.method min // int min

.args 3 // ( int a, int b ){

.define a = 1

.define b = 2

.locals 1 // int r;

.define r = 3

iload a // if ( a >= b ) iload b isub

// stack = a - b, ... ; a - b < 0 => a < b

iflt else

iload b // r = b; istore r goto end_if

else: // else iload a // r = a; istore r

end_if: iload r // return r; ireturn

// }

Symbolsk maskinsprogSymbolske ordrer

bipush, iload 1-1 afbildning

Direktiver/pseudoinstruktioner.define a=1 symbolsk konstant.method min metode start.args 3 antal argumenter.locals 1 antal lokale variable

Labelselse:end_if:

Page 8: Symbolsk maskinsprog

.method main // int main

.args 3 // ( int a, int b )

.define a = 1

.define b = 2 // { bipush 88 // Push object reference. iload a iload b invokevirtual min ireturn // return min ( a, b ); // }

.method min // int min

.args 3 // ( int a, int b ){

.define a = 1

.define b = 2

.locals 1 // int r;

.define r = 3

iload a // if ( a >= b ) iload b isub

// stack = a - b, ... ; a - b < 0 => a < b

iflt else

iload b // r = b; istore r goto end_if

else: // else iload a // r = a; istore r

end_if: iload r // return r; ireturn

// }

Symbolsk maskinsprogSymbolske ordrer

bipush, iload 1-1 afbildning

Direktiver/pseudoinstruktioner.define a=1 symbolsk konstant.method min metode start.args 3 antal argumenter.locals 1 antal lokale variable

Labelselse:end_if:

Symbolske operandera, b, r symbolske konstantmin metodenavnelse, end_if label

Page 9: Symbolsk maskinsprog

Pentium symbolsk maskinsprog

.section .data # start of data sectiona: .long 42 # variable ab: .long 53 # variable bm: .long 0 # variable m

.section .text # start of text section

.globl _start # _start is a global symbol# specifying program start

_start: # int main (void) movl a, %eax # movl b, %ebx # cpml %eax, %ebx # compute b-a <= 0 and

# set eflags jle if # if (a >= b) jmp else

if: movl %eax, m # m = a jmp endif

# elseelse: movl %ebx, m # m = b

endif: movl m, %ebxmovl $1, %eaxint $0x80 # return m

Page 10: Symbolsk maskinsprog

Pentium symbolsk maskinsprog

.section .data # start of data sectiona: .long 42 # variable ab: .long 53 # variable bm: .long 0 # variable m

.section .text # start of text section

.globl _start # _start is a global symbol

# specifying program start

_start: # int main (void) movl a, %eax # movl b, %ebx # cpml %eax, %ebx # compute b-a <= 0 and

# set eflags jle if # if (a >= b) jmp else

if: movl %eax, m # m = a jmp endif

# elseelse: movl %ebx, m # m = b

endif: movl m, %ebx movl $1, %eax int $0x80 # return m

Symbolske ordrermovl, cpml, jle, ...

Direktiver.section.globl

Labels_start:if:

Symbolske operandera, b, m%eax, %ebx

Samme struktur som program i IJVM symbolsk maskinsprog

Page 11: Symbolsk maskinsprog

SCO figur 7.2

Forsk

ellige assemb

leres realiserin

g af N =

I + J

Page 12: Symbolsk maskinsprog

Symbolske maskinsprogAsm-niveauet realiseres af assembleren. Der kan sagtens være flere realiseringen ovenpå samme ISA-niveau ...

.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_ifelse: // else iload a // r = a; istore rend_if: iload r // return r; ireturn

// }

.def min[3,1] # int min

.eq a = 1

.eq b = 2

.eq r = 3

ld a # if ( a >= b ) ld b sub iflt else ld b # r = b; sto r jmp end_ifelse: # else ld a # r = a; sto rend_if: ld r # return r; ret

# }

Forskellige direktiver, symbolsk ordrenavne, ...

Page 13: Symbolsk maskinsprog

.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_ifelse: // else iload a // r = a; istore rend_if: iload r // return r; ireturn // }

Page 14: Symbolsk maskinsprog

_main index_ 0

_method area_

00 0300 00

bipush 88iload 1iload 2invokevirtual 1ireturn

00 0300 01

iload 1iload 2isubiflt 10iload 2istore 3goto 7iload 1istore 3iload 3ireturn

_constant pool_

000000000000000e

.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_ifelse: // else iload a // r = a; istore rend_if: iload r // return r; ireturn // }

Page 15: Symbolsk maskinsprog

_main index_ 0

_method area_

00 0300 00

bipush 88iload 1iload 2invokevirtual 1ireturn

00 0300 01

iload 1iload 2isubiflt 10iload 2istore 3goto 7iload 1istore 3iload 3ireturn

_constant pool_

000000000000000e

.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_ifelse: // else iload a // r = a; istore rend_if: iload r // return r; ireturn // }

“Abstraktionsniveauet” i det symbolske maskin- sprog bestemmes af assembleren ...

Page 16: Symbolsk maskinsprog

Et symbolsk maskinsprog til IJVM (dComNet-nr.2)

Page 17: Symbolsk maskinsprog
Page 18: Symbolsk maskinsprog

Programmering i symbolsk maskinsprog

... Effektive og maskinnære programmer, men besværligt ...

... skal bruges med omtanke ...

... programmering af ydre enheder, oversættere ...

Page 19: Symbolsk maskinsprog

Programmering i symbolsk maskinsprogint main(){ return gcd(2,3);}

int gcd(int x, int y){ while ( x != y ){ if ( x < y ) y = y - x; else x = x - y; } return x;}

... systematisk oversættelse af højniveau-konstruktioner ...

metoder med parameteroverførelsevariabel erklæringer med simple typerkontrol strukturer; if-then-else, while

beregning af betingelser og udtryk

Page 20: Symbolsk maskinsprog

dComNet-nr.1

Page 21: Symbolsk maskinsprog
Page 22: Symbolsk maskinsprog
Page 23: Symbolsk maskinsprog

Eksempel

int main(){ return gcd(2,3);}

int gcd(int x, int y){ while ( x != y ){ if ( x < y ) y = y - x; else x = x - y; } return x;}

Page 24: Symbolsk maskinsprog

int gcd(int x, int y){ while ( x != y ){ if ( x < y ) y = y - x; else x = x - y; } return x;}

.method gcd // int gcd

.args 3 // ( int x, int y)

.locals 0

.define x = 1

.define y = 2 // {

... // }

Metode

Page 25: Symbolsk maskinsprog

Metode – Ordning af parametre

Vigtigt at have en konvention for rækkefølgen!!

Caller's LVCaller's PC

xy

Link prt

SP

LV

Caller's LVCaller's PC

yx

Link prt

SP

LV

+2+1

+2+1

.method gcd // int gcd

.args 3 // ( int x, int y)

.locals 0

.define x = 1

.define y = 2 // {... // }

Page 26: Symbolsk maskinsprog

Metode – Ordning af parametre

IJVM konvention

.method gcd // int gcd

.args 3 // ( int x, int y)

.locals 0

.define x = 1

.define y = 2 // {... // }

Caller's LVCaller's PC

xy

Link prt

SP

LV

Caller's LVCaller's PC

yx

Link prt

SP

LV

+2+1

+2+1

Page 27: Symbolsk maskinsprog

int gcd(int x, int y){ while ( x != y ){ if ( x < y ) y = y - x; else x = x - y; } return x;}

Metode

Caller's LVCaller's PC

yx

Link prt

SP

LV

+2+1

.method gcd // int gcd

.args 3 // ( int x, int y)

.locals 0

.define x = 1

.define y = 2 // {

... // }

Page 28: Symbolsk maskinsprog

int imul(int a, int b){ int p;

p = 0; while ( a < 0 ){ a = a - 1; p = p + b; } return p;}

Sidemandsopgave

Caller's LVCaller's PC

yx

Link prt

SP

LV

+2+1

??? // {

... // }

Over sæt

Page 29: Symbolsk maskinsprog

int gcd(int x, int y){ while ( x != y ){ if ( x < y ) y = y - x; else x = x - y; } return x;}

while: // while iload x iload y if_icmpeq end_while // ( x != y ) // { ...

goto while // }

end_while:

Kontrolstruktur / while-løkke

Page 30: Symbolsk maskinsprog

int imul(int a, int b){ int p;

p = 0; while ( a < 0 ){ a = a - 1; p = p + b; } return p;}

Sidemandsopgave

??? // {

... // }

Over sæt

Page 31: Symbolsk maskinsprog

int gcd(int x, int y){ while ( x != y ){ if ( x < y ) y = y - x; else x = x - y; } return x;}

iload x // if iload y isub// stack = x-y, x-y < 0 => ( x < y ) iflt then goto elsethen: // { ...

goto end_if // }else: // else ... // { // }end_if:

...

Kontrolstruktur / if-then-else

Page 32: Symbolsk maskinsprog

int gcd(int x, int y){ while ( x != y ){ if ( x < y ) y = y - x; else x = x - y; } return x;}

iload y iload x isub istore y // y = y - x;

iload x iload y isub istore x // x = x - y;

iload xireturn // return x;

Beregning af udtryk, variabletildeling og returnværdi

Page 33: Symbolsk maskinsprog

int imul(int a, int b){ int p;

p = 0; while ( a < 0 ){ a = a - 1; p = p + b; } return p;}

Sidemandsopgave

??? // {

... // }

Over sæt

Page 34: Symbolsk maskinsprog

int main(){ return gcd(2,3);}

.method main // int main()

.args 1

.locals 0 //{// push object reference bipush 88// push arguments bipush 2 bipush 3 invokevirtual gcd ireturn // return gcd(2,3) // }

Metode og metodekald

Caller's LVCaller's PC

yx

Link prt

SP

LV

+2+1

Page 35: Symbolsk maskinsprog

int main(){ return imul(2,3);}

???

Sidemandsopgave

Caller's LVCaller's PC

ba

Link prt

SP

LV

+2+1Over

sæt

Page 36: Symbolsk maskinsprog

// Greatest common divisor.

.method gcd // int gcd

.args 3 // ( int x. int y)

.define x = 1

.define y = 2// {

while: // while iload x iload y if_icmpeq end_while // ( x != y )

// { iload x // if iload y isub // stack = x-y, x-y < 0 => ( x < y ) iflt then goto elsethen: // { iload y iload x isub istore y // y = y - x; goto end_if // }else: // else iload x // { iload y isub istore x // x = x - y;

// }end_if: goto while // }end_while: iload x ireturn // return x;

// }.method main bipush 88 bipush 2 bipush 3 invokevirtual gcd ireturn // return gcd(2,3)

Page 37: Symbolsk maskinsprog

ijvm-asm gcd.j gcd.bc

ijvm gcd.bc

gcd.j

oversættes til

fortolkes af

IJVM maskine

main index: 1method area: 59 bytes00 03 00 00 15 01 15 02 9f 00 22 15 01 15 02 649b 00 06 a7 00 0d 15 02 15 01 64 36 02 a7 00 0a15 01 15 02 64 36 01 a7 ff dd 15 01 ac 00 01 0000 10 58 10 02 10 03 b6 00 00 acconstant pool: 2 words000000000000002d

Page 38: Symbolsk maskinsprog

IJVM Trace of gcd.bc

stack = 0, 1, 18 1:bipush 88 [10 58] stack = 88, 0, 1, 18 2:bipush 2 [10 02] stack = 2, 88, 0, 1, 18 3:bipush 3 [10 03] stack = 3, 2, 88, 0, 1, 18 4:invokevirtual 0 [b6 00 00] stack = 17, 58, 3, 2, 23, 0, 1, 18 5:iload 1 [15 01] stack = 2, 17, 58, 3, 2, 23, 0, 1 6:iload 2 [15 02] stack = 2, 2, 17, 58, 3, 2, 23, 0 7:if_icmpeq 34 [9f 00 22] stack = 17, 58, 3, 2, 23, 0, 1, 18 8:iload 1 [15 01] stack = 2, 17, 58, 3, 2, 23, 0, 1 9:iload 2 [15 02] stack = 3, 2, 17, 58, 3, 2, 23, 010:isub [64] stack = -1, 17, 58, 3, 2, 23, 0, 111:iflt 6 [9b 00 06] stack = 17, 58, 3, 2, 23, 0, 1, 1812:iload 2 [15 02] stack = 3, 17, 58, 3, 2, 23, 0, 113:iload 1 [15 01] stack = 2, 3, 17, 58, 3, 2, 23, 014:isub [64] stack = 1, 17, 58, 3, 2, 23, 0, 115:istore 2 [36 02] stack = 1, 17, 58, 1, 2, 23, 0, 1, 1816:goto 10 [a7 00 0a] stack = 17, 58, 1, 2, 23, 0, 1, 1817:goto -35 [a7 ff dd] stack = 17, 58, 1, 2, 23, 0, 1, 1818:iload 1 [15 01] stack = 2, 17, 58, 1, 2, 23, 0, 119:iload 2 [15 02] stack = 1, 2, 17, 58, 1, 2, 23, 020:if_icmpeq 34 [9f 00 22] stack = 17, 58, 1, 2, 23, 0, 1, 1821:iload 1 [15 01] stack = 2, 17, 58, 1, 2, 23, 0, 122:iload 2 [15 02] stack = 1, 2, 17, 58, 1, 2, 23, 023:isub [64] stack = -1, 17, 58, 1, 2, 23, 0, 124:iflt 6 [9b 00 06] stack = 17, 58, 1, 2, 23, 0, 1, 1825:goto 13 [a7 00 0d] stack = 17, 58, 1, 2, 23, 0, 1, 1826:iload 1 [15 01] stack = 2, 17, 58, 1, 2, 23, 0, 127:iload 2 [15 02] stack = 1, 2, 17, 58, 1, 2, 23, 028:isub [64] stack = 1, 17, 58, 1, 2, 23, 0, 129:istore 1 [36 01] stack = 17, 58, 1, 1, 23, 0, 1, 1830:goto -35 [a7 ff dd] stack = 17, 58, 1, 1, 23, 0, 1, 1831:iload 1 [15 01] stack = 1, 17, 58, 1, 1, 23, 0, 132:iload 2 [15 02] stack = 786, 1, 17, 58, 1, 1, 23, 033:if_icmpeq 34 [9f 00 22] stack = 17, 58, 1, 1, 23, 0, 1, 1834:iload 1 [15 01] stack = 1, 17, 58, 1, 1, 23, 0, 135:ireturn [ac] stack = 1, 0, 1, 1836:ireturn [ac] stack = 1

Diskutér m

ed din sidemandd: D

er er fire fejl på stakken – hvilke og hvad er det rigtige?

ijvm gcd.bc

Page 39: Symbolsk maskinsprog

Afprøvning af programmer

Ekstern afprøvning

Sammenlign et af programmet beregnet resultat med kendt og korrekt resultat ...

Intern afprøvning

Alle dele af programmet skal være gennemløbet og alle betingede hop skal være afviklet med betingelsen opfyldt og ikke opfyldt ...

Page 40: Symbolsk maskinsprog

Arbejdsgang ...

Evt. optimeringer foretages altid på et korrekt program ...

Tag udgangspunkt i et C/java program

Oversæt systematisk til symbolsk maskinsprog

Kommenter med C/java programmet

Afprøv programmet eksternt og internt