Subroutinen: C-Programm und Assembler-Darstellungen (Slides2011) - 02_6_func.assembler

Wir betrachten das untenstehende kleine C-Programm und geben Assemblerdarstellungen für Motorola 68000, Intel i386, Sun Sparc, HP Precision Architecture und DEC Alpha-Prozessoren an. Auf allen Architekturen waren UNIX-Derivate als Betriebssystem im Einsatz. Das Programm wurde jeweils mit

cc -S add.c

übersetzt. Auf Intel und Sun wurde der GNU-C-Compiler verwendet.


int f( int a, int b ) {
       return a + b;
}

main() {
       int a, b, c;

       a = 5;
       b = 6;

       c = f( a, b);
}

Motorola 68000

.text
       .align 1
.globl _f
_f:
       link a6,#0
       movel a6@(8),d1
       addl a6@(12),d1
       movel d1,d0
       jra L1
L1:
       unlk a6
       rts
       .align 1
.globl _main
_main:
       link a6,#-12
       moveq #5,d1
       movel d1,a6@(-4)
       moveq #6,d1
       movel d1,a6@(-8)
       movel a6@(-8),sp@-
       movel a6@(-4),sp@-
       jbsr _f
       addqw #8,sp
       movel d0,a6@(-12)
L2:
       unlk a6
       rts

Intel i386

.file   "func.c"
       .version        "01.01"
gcc2_compiled.:
.text
       .align 16
.globl f
       .type    f,@function
f:
       pushl %ebp
       movl %esp,%ebp
       movl 8(%ebp),%edx
       addl 12(%ebp),%edx
       movl %edx,%eax
       jmp .L1
       .align 16
.L1:
       movl %ebp,%esp
       popl %ebp
       ret
.Lfe1:
       .size    f,.Lfe1-f
       .align 16
.globl main
       .type    main,@function
main:
       pushl %ebp
       movl %esp,%ebp
       subl $12,%esp
       movl $5,-4(%ebp)
       movl $6,-8(%ebp)
       movl -8(%ebp),%eax
       pushl %eax
       movl -4(%ebp),%eax
       pushl %eax
       call f
       addl $8,%esp
       movl %eax,%eax
       movl %eax,-12(%ebp)
.L2:
       movl %ebp,%esp
       popl %ebp
       ret
.Lfe2:
       .size    main,.Lfe2-main
       .ident  "GCC: (GNU) 2.7.0"

Sun Sparc

    .file   "func.c"
gcc2_compiled.:
.section        ".text"
       .align 4
       .global f
       .type    f,#function
       .proc   04
f:
       !#PROLOGUE# 0
       save %sp,-112,%sp
       !#PROLOGUE# 1
       st %i0,[%fp+68]
       st %i1,[%fp+72]
       ld [%fp+68],%o0
       ld [%fp+72],%o1
       add %o0,%o1,%o0
       mov %o0,%i0
       b .LL1
       nop
.LL1:
       ret
       restore
.LLfe1:
       .size    f,.LLfe1-f
       .align 4
       .global main
       .type    main,#function
       .proc   04
main:
       !#PROLOGUE# 0
       save %sp,-128,%sp
       !#PROLOGUE# 1
       mov 5,%o0
       st %o0,[%fp-20]
       mov 6,%o0
       st %o0,[%fp-24]
       ld [%fp-20],%o0
       ld [%fp-24],%o1
       call f,0
       nop
       st %o0,[%fp-28]
.LL2:
       ret
       restore
.LLfe2:
       .size    main,.LLfe2-main
       .ident  "GCC: (GNU) 2.8.0"

HP Precision Architecture (HP-PA)

.text
       .align 2
.globl _f
_f:
       copy %r4,%r1
       copy %r30,%r4
       stwm %r1,64(0,%r30)
       stw %r26,-36(0,%r4)
       stw %r25,-40(0,%r4)
       ldw -36(0,%r4),%r19
       ldw -40(0,%r4),%r20
       add %r19,%r20,%r19
       copy %r19,%r28
       bl,n L1,%r0
L1:
       ldo 64(%r4),%r30
       ldwm -64(0,%r30),%r4
       bv,n 0(%r2)
       .align 2
.globl _main
_main:
       stw %r2,-20(0,%r30)
       copy %r4,%r1
       copy %r30,%r4
       stwm %r1,128(0,%r30)
       ldi 5,%r19
       stw %r19,8(0,%r4)
       ldi 6,%r19
       stw %r19,12(0,%r4)
       ldw 8(0,%r4),%r26
       ldw 12(0,%r4),%r25
       jbsr _f,%r2,L3
       nop
       copy %r28,%r19
       stw %r19,16(0,%r4)
L2:
       ldw -20(0,%r4),%r2
       ldo 64(%r4),%r30
       ldwm -64(0,%r30),%r4
       bv,n 0(%r2)
L3:
       ldil L`_f,%r1
       ble,n R`_f(4,%r1)

DEC Alpha

 .ugen
       .verstamp       3 11
       .text
       .align  4
       .file   2 "func.c"
       .globl  f
       .loc    2 2
#    1
#    2 int f( int a, int b ) {
       .ent    f 2
f:
       .option O1
       ldgp    $gp, 0($27)
       .frame  $sp, 0, $26, 0
       .prologue       1
       addl    $16, 0, $16
       addl    $17, 0, $17
       .loc    2 2

       .loc    2 3
#    3         return a + b;
       addl    $16, $17, $0
       .livereg        0xFC7F0002,0x3FC00000
       ret     $31, ($26), 1
       .end    f
       .text
       .align  4
       .file   2 "func.c"
       .globl  main
       .loc    2 6
#    4 }
#    5
#    6 main() {
       .ent    main 2
main:
       .option O1
       ldgp    $gp, 0($27)
       lda     $sp, -48($sp)
       stq     $26, 0($sp)
       .mask   0x04000000, -48
       .frame  $sp, 48, $26, 0
       .prologue       1
       .loc    2 6

       .loc    2 9
#    7         int a, b, c;
#    8
#    9         a = 5;
       ldil    $1, 5
       stl     $1, 40($sp)
       .loc    2 10
#   10         b = 6;
       ldil    $2, 6
       stl     $2, 32($sp)
       .loc    2 12
#   11
#   12         c = f( a, b);
       ldil    $16, 5
       ldil    $17, 6
       .livereg        0x0001C002,0x00000000
       jsr     $26, f
       ldgp    $gp, 0($26)
       stl     $0, 24($sp)
       .loc    2 13
#   13 }
       bis     $31, $31, $0
       .livereg        0xFC7F0002,0x3FC00000
       ldq     $26, 0($sp)
       lda     $sp, 48($sp)
       ret     $31, ($26), 1
       .end    main