C Assemblercode erklaeren

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
Das ist doch redundant?!

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 :)
 
Mir sind einfach noch viele Sachen unklar und manche Codefragmente finde ich einfach nur unsinnig.

Ich schätze, dass der Code vom Compiler nicht optimiert wurde und es der Compiler mit Optimierung (z.B. O2) schon berichtigen wird.
 
Danke für den Hinweis, leider is das nicht erlaubt.
Es handelt sich wieder einmal um eine Uniaufgabe.

Calling a function builds a new “frame” on the stack, saving the state of the calling function (caller). It is also used to return the result of the called function (callee) back to the caller. Compile the following code with gcc -O0 -S to extract its assembler code. You can find a short description of how to read assembler code at [1]. Annotate each line of the assembler code with a comment that explains why it is executed (e.g., write “save old stackpointer” rather than “push esp on stack”).

Also wir sollen den obigen Assemblercode kommentieren (den haben die Unirechner und Fedora11 erstellt...)

Aber ich schau mir jetzt mal die optimierte Variante an, die bringt mich hoffentlich weiter.
 
Wenn du es besser lesbar haben willst, dann schalt den Assembler Syntax auf Intel um. AT&T Assembler ist hässlich..
 
Zurück
Oben