Symbolsk maskinsprog
Sponsored Links
This presentation is the property of its rightful owner.
1 / 40

Symbolsk maskinsprog PowerPoint PPT Presentation


  • 42 Views
  • Uploaded on
  • Presentation posted in: General

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.

Download Presentation

Symbolsk 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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Symbolsk maskinsprog


Niveauerafabstraktemaskiner

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)


Symbolskmaskinsprog

.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

// }

Maskinsprog

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


Symbolskmaskinsprog

.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

// }

Symbolske ordrer

1-1 afbildning mellem maskinordre og symbolsk maskinordre


Symbolskmaskinsprog

.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

// }

Symbolskeordrer

bipush, iload1-1 afbildning

Direktiver/pseudoinstruktioner

.define a=1symbolskkonstant

.method min metode start

.args 3antalargumenter

.locals 1antallokale variable


Symbolskmaskinsprog

.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

// }

Symbolskeordrer

bipush, iload1-1 afbildning

Direktiver/pseudoinstruktioner

  • .define a=1symbolskkonstant

  • .method min metode start

  • .args 3antalargumenter

  • .locals 1antallokale variable

    Labels

    else:

    end_if:


Symbolskmaskinsprog

.method main // int main

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

.define a = 1

.define b = 2

// {

bipush 88

// Push object reference.

iloada

iloadb

invokevirtualmin

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

iloada // if ( a >= b )

iloadb

isub

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

ifltelse

iloadb // r = b;

istorer

gotoend_if

else: // else

iloada // r = a;

istorer

end_if:

iloadr // return r;

ireturn

// }

Symbolskeordrer

bipush, iload1-1 afbildning

Direktiver/pseudoinstruktioner

  • .define a=1symbolskkonstant

  • .method min metode start

  • .args 3antalargumenter

  • .locals 1antallokale variable

    Labels

    else:

    end_if:

    Symbolskeoperander

    a, b, rsymbolskekonstant

    minmetodenavn

    else, end_iflabel


Pentium symbolsk maskinsprog

.section .data# start of data section

a: .long 42# variable a

b: .long 53# variable b

m: .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

jmpendif

# else

else: movl %ebx, m# m = b

endif: movl m, %ebx

movl $1, %eax

int $0x80# return m


Pentium symbolsk maskinsprog

Symbolske ordrer

movl, cpml, jle, ...

Direktiver

.section

.globl

Labels

_start:

if:

Symbolske operander

a, b, m

%eax, %ebx

.section .data# start of data section

a: .long 42# variable a

b: .long 53# variable b

m: .long 0# variable m

.section .text# start of text section

.globl_start# _start is a global symbol

# specifying program start

_start:# int main (void)

movla, %eax#

movlb, %ebx#

cpml%eax, %ebx# compute b-a <= 0 and

# set eflags

jleif# if (a >= b)

jmpelse

if:movl%eax, m# m = a

jmpendif

# else

else:movl%ebx, m# m = b

endif:movlm, %ebx

movl$1, %eax

int$0x80# return m

Samme struktur som program i IJVM symbolsk maskinsprog


Forskelligeassembleres realiseringaf N = I + J

SCO figur 7.2


Symbolskemaskinsprog

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

.def min[3,1] # int min

.eq a = 1

.eq b = 2

.eq r = 3

lda # if ( a >= b )

ldb

sub

ifltelse

ldb # r = b;

stor

jmpend_if

else: # else

lda # r = a;

stor

end_if:

ldr # return r;

ret

# }

.method min // int min

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

.define a = 1

.define b = 2

.locals 1 // int r;

.define r = 3

iloada // if ( a >= b )

iloadb

isub

ifltelse

iloadb // r = b;

istorer

gotoend_if

else: // else

iloada // r = a;

istorer

end_if:

iloadr // return r;

ireturn

// }

Forskellige direktiver, symbolsk ordrenavne, ...


.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 // }


.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

bipush 88

iload 1

iload 2

invokevirtual 1

ireturn

00 03

00 01

iload 1

iload 2

isub

iflt 10

iload 2

istore 3

goto 7

iload 1

istore 3

iload 3

ireturn

_constant pool_

00000000

0000000e


.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

bipush 88

iload 1

iload 2

invokevirtual 1

ireturn

00 03

00 01

iload 1

iload 2

isub

iflt 10

iload 2

istore 3

goto 7

iload 1

istore 3

iload 3

ireturn

_constant pool_

00000000

0000000e

“Abstraktionsniveauet” idetsymbolskemaskin- sprogbestemmesafassembleren ...


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


Programmering i symbolsk maskinsprog

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

... skal bruges med omtanke ...

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


Programmering i symbolsk maskinsprog

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;

}

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

metoder med parameteroverførelse

variabel erklæringer med simple typer

kontrol strukturer; if-then-else, while

beregning af betingelser og udtryk


dComNet-nr.1


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;

}


Metode

intgcd(int x, int y)

{

while ( x != y ){

if ( x < y )

y = y - x;

else

x = x - y;

}

return x;

}

.method gcd // intgcd

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

.locals 0

.define x = 1

.define y = 2

// {

...

// }


Metode – Ordningafparametre

.method gcd // int gcd

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

.locals 0

.define x = 1

.define y = 2

// {

...

// }

SP

SP

Caller's LV

Caller's PC

x

y

Link prt

Caller's LV

Caller's PC

y

x

Link prt

+2

+1

+2

+1

LV

LV

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


Metode – Ordningafparametre

.method gcd // int gcd

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

.locals 0

.define x = 1

.define y = 2

// {

...

// }

SP

SP

Caller's LV

Caller's PC

x

y

Link prt

Caller's LV

Caller's PC

y

x

Link prt

+2

+1

+2

+1

LV

LV

IJVM konvention


Metode

int gcd(int x, int y)

{

while ( x != y ){

if ( x < y )

y = y - x;

else

x = x - y;

}

return x;

}

SP

Caller's LV

Caller's PC

y

x

Link prt

+2

+1

LV

.method gcd // intgcd

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

.locals 0

.define x = 1

.define y = 2

// {

...

// }


Sidemandsopgave

intimul(int a, int b)

{

int p;

p = 0;

while ( a < 0 ){

a = a - 1;

p = p+b;

}

return p;

}

SP

Caller's LV

Caller's PC

y

x

Link prt

+2

+1

LV

Over sæt

???

// {

...

// }


Kontrolstruktur / while-løkke

intgcd(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_icmpeqend_while // ( x != y )

// {

...

goto while // }

end_while:


Sidemandsopgave

intimul(int a, int b)

{

int p;

p = 0;

while ( a < 0 ){

a = a - 1;

p = p+b;

}

return p;

}

Over sæt

???

// {

...

// }


Kontrolstruktur / if-then-else

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 else

then: // {

...

goto end_if // }

else: // else

... // {

// }

end_if:

...


Beregningafudtryk, variabletildelingogreturnværdi

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 x

ireturn // return x;


Sidemandsopgave

intimul(int a, int b)

{

int p;

p = 0;

while ( a < 0 ){

a = a - 1;

p = p + b;

}

return p;

}

Over sæt

???

// {

...

// }


Metodeogmetodekald

int main()

{

return gcd(2,3);

}

SP

Caller's LV

Caller's PC

y

x

Link prt

+2

+1

LV

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

// }


Sidemandsopgave

int main()

{

return imul(2,3);

}

SP

Caller's LV

Caller's PC

b

a

Link prt

+2

+1

Over sæt

LV

???


// Greatest common divisor.

.method gcd// intgcd

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

.define x = 1

.define y = 2

// {

while:// while

iload x

iload y

if_icmpeqend_while// ( x != y )

// {

iload x // if

iload y

isub// stack = x-y, x-y < 0 => ( x < y )

iflt then

goto else

then:// {

iload y

iload x

isub

istore y// y = y - x;

gotoend_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

bipush88

bipush 2

bipush 3

invokevirtualgcd

ireturn// return gcd(2,3)


gcd.j

oversættes til

ijvm-asmgcd.j gcd.bc

main index: 1

method area: 59 bytes

00 03 00 00 15 01 15 02 9f 00 22 15 01 15 02 64

9b 00 06 a7 00 0d 15 02 15 01 64 36 02 a7 00 0a

15 01 15 02 64 36 01 a7 ff dd 15 01 ac 00 01 00

00 10 58 10 02 10 03 b6 00 00 ac

constant pool: 2 words

00000000

0000002d

fortolkes af

ijvm gcd.bc

IJVM maskine


ijvm gcd.bc

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, 0

10:isub [64] stack = -1, 17, 58, 3, 2, 23, 0, 1

11:iflt 6 [9b 00 06] stack = 17, 58, 3, 2, 23, 0, 1, 18

12:iload 2 [15 02] stack = 3, 17, 58, 3, 2, 23, 0, 1

13:iload 1 [15 01] stack = 2, 3, 17, 58, 3, 2, 23, 0

14:isub [64] stack = 1, 17, 58, 3, 2, 23, 0, 1

15:istore 2 [36 02] stack = 1, 17, 58, 1, 2, 23, 0, 1, 18

16:goto 10 [a7 00 0a] stack = 17, 58, 1, 2, 23, 0, 1, 18

17:goto -35 [a7 ff dd] stack = 17, 58, 1, 2, 23, 0, 1, 18

18:iload 1 [15 01] stack = 2, 17, 58, 1, 2, 23, 0, 1

19:iload 2 [15 02] stack = 1, 2, 17, 58, 1, 2, 23, 0

20:if_icmpeq 34 [9f 00 22] stack = 17, 58, 1, 2, 23, 0, 1, 18

21:iload 1 [15 01] stack = 2, 17, 58, 1, 2, 23, 0, 1

22:iload 2 [15 02] stack = 1, 2, 17, 58, 1, 2, 23, 0

23:isub [64] stack = -1, 17, 58, 1, 2, 23, 0, 1

24:iflt 6 [9b 00 06] stack = 17, 58, 1, 2, 23, 0, 1, 18

25:goto 13 [a7 00 0d] stack = 17, 58, 1, 2, 23, 0, 1, 18

26:iload 1 [15 01] stack = 2, 17, 58, 1, 2, 23, 0, 1

27:iload 2 [15 02] stack = 1, 2, 17, 58, 1, 2, 23, 0

28:isub [64] stack = 1, 17, 58, 1, 2, 23, 0, 1

29:istore 1 [36 01] stack = 17, 58, 1, 1, 23, 0, 1, 18

30:goto -35 [a7 ff dd] stack = 17, 58, 1, 1, 23, 0, 1, 18

31:iload 1 [15 01] stack = 1, 17, 58, 1, 1, 23, 0, 1

32:iload 2 [15 02] stack = 786, 1, 17, 58, 1, 1, 23, 0

33:if_icmpeq 34 [9f 00 22] stack = 17, 58, 1, 1, 23, 0, 1, 18

34:iload 1 [15 01] stack = 1, 17, 58, 1, 1, 23, 0, 1

35:ireturn [ac] stack = 1, 0, 1, 18

36:ireturn [ac] stack = 1

Diskutér med din sidemandd: Derer fire fejlpåstakken – hvilkeoghvaderdetrigtige?


Afprøvning af programmer

Eksternafprøvning

Sammenlignet afprogrammetberegnetresultat med kendtogkorrektresultat ...

Intern afprøvning

Alledele afprogrammetskalværegennemløbetogallebetingede hop skalværeafviklet med betingelsenopfyldtogikkeopfyldt ...


IJVM Trace of gcd.bc

stack = 0, 1, 18

bipush 88 [10 58] stack = 88, 0, 1, 18

bipush 2 [10 02] stack = 2, 88, 0, 1, 18

bipush 3 [10 03] stack = 3, 2, 88, 0, 1, 18

invokevirtual 0 [b6 00 00] stack = 17, 58, 3, 2, 23, 0, 1, 18

iload 1 [15 01] stack = 2, 17, 58, 3, 2, 23, 0, 1

iload 2 [15 02] stack = 3, 2, 17, 58, 3, 2, 23, 0

if_icmpeq 34 [9f 00 22] stack = 17, 58, 3, 2, 23, 0, 1, 18

iload 1 [15 01] stack = 2, 17, 58, 3, 2, 23, 0, 1

iload 2 [15 02] stack = 3, 2, 17, 58, 3, 2, 23, 0

isub [64] stack = -1, 17, 58, 3, 2, 23, 0, 1

iflt 6 [9b 00 06] stack = 17, 58, 3, 2, 23, 0, 1, 18

iload 2 [15 02] stack = 3, 17, 58, 3, 2, 23, 0, 1

iload 1 [15 01] stack = 2, 3, 17, 58, 3, 2, 23, 0

isub [64] stack = 1, 17, 58, 3, 2, 23, 0, 1

istore 2 [36 02] stack = 17, 58, 1, 2, 23, 0, 1, 18

goto 10 [a7 00 0a] stack = 17, 58, 1, 2, 23, 0, 1, 18

goto -35 [a7 ff dd] stack = 17, 58, 1, 2, 23, 0, 1, 18

iload 1 [15 01] stack = 2, 17, 58, 1, 2, 23, 0, 1

iload 2 [15 02] stack = 1, 2, 17, 58, 1, 2, 23, 0

if_icmpeq 34 [9f 00 22] stack = 17, 58, 1, 2, 23, 0, 1, 18

iload 1 [15 01] stack = 2, 17, 58, 1, 2, 23, 0, 1

iload 2 [15 02] stack = 1, 2, 17, 58, 1, 2, 23, 0

isub [64] stack = 1, 17, 58, 1, 2, 23, 0, 1

iflt 6 [9b 00 06] stack = 17, 58, 1, 2, 23, 0, 1, 18

goto 13 [a7 00 0d] stack = 17, 58, 1, 2, 23, 0, 1, 18

iload 1 [15 01] stack = 2, 17, 58, 1, 2, 23, 0, 1

iload 2 [15 02] stack = 1, 2, 17, 58, 1, 2, 23, 0

isub [64] stack = 1, 17, 58, 1, 2, 23, 0, 1

istore 1 [36 01] stack = 17, 58, 1, 1, 23, 0, 1, 18

goto -35 [a7 ff dd] stack = 17, 58, 1, 1, 23, 0, 1, 18

iload 1 [15 01] stack = 1, 17, 58, 1, 1, 23, 0, 1

iload 2 [15 02] stack = 1, 1, 17, 58, 1, 1, 23, 0

if_icmpeq 34 [9f 00 22] stack = 17, 58, 1, 1, 23, 0, 1, 18

iload 1 [15 01] stack = 1, 17, 58, 1, 1, 23, 0, 1

ireturn [ac] stack = 1, 0, 1, 18

ireturn [ac] stack = 1

ijvm gcd.bc


Arbejdsgang ...

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

Tag udgangspunkti et C/java program

Oversæt systematisktilsymbolskmaskinsprog

Kommenter med C/java programmet

Afprøvprogrammeteksterntoginternt


  • Login