MR34L
Cadet 4th Year
- Registriert
- Apr. 2008
- Beiträge
- 107
Code:
#include <inttypes.h>
uint64_t square(uint32_t x) {
uint64_t res;
res = x * x;
}
int main() {
uint32_t y = 5, z;
z = square(y);
return 0;
}
Code:
.file "stackmagic.c"
.text
.globl square
.type square, @function
square:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movl %edi, -20(%rbp)
movl -20(%rbp), %eax
imull -20(%rbp), %eax
mov %eax, %eax
movq %rax, -8(%rbp)
movq -8(%rbp), %rax // res
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size square, .-square
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
subq $16, %rsp
movl $5, -8(%rbp)
movl -8(%rbp), %eax
movl %eax, %edi // in %edi befindet sich der parameter von square (=5)
call square
movl %eax, -4(%rbp)
movl $0, %eax // return 0
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (GNU) 4.4.4 20100630 (Red Hat 4.4.4-10)"
.section .note.GNU-stack,"",@progbits
Mir sind einfach noch viele Sachen unklar und manche Codefragmente finde ich einfach nur unsinnig.
z.B.
Code:
mov %eax, %eax
movq %rax, -8(%rbp)
movq -8(%rbp), %rax
Und was hat es mit Stack- und Framepointer auf sich?
Beide Funktionen sollten 64 Bit reservieren, oder halt 8 Byte.
Aber iwie sagt mir der Assemblercode nicht viel...
Bin für jede Hilfe dankbar