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