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
ü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