ASM Commento sqrt() in assembly

Stato
Discussione chiusa ad ulteriori risposte.

dante.cpp

Utente Silver
25 Novembre 2011
34
13
0
57
Appena sotto ho riportato il codice assembly, del programma:
Codice:
#include <math.h>


int main() {
	sqrt(6);
}


passando il codice a gdb esso comincerà ad eseguirlo dall'istruzione "movl $0, %eax", il mio problema è, perché? Inoltre se qualcuno fosse in grado di commentare le seguenti istruzioni gliene sarei molto grato!


Codice:
	.file	"Xprovadebug.c"
	.text
	.globl	_start
	.type	_start, @function
_start:movl	$0, %eax
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	movl	$0, %eax
	popl	%ebp
	.cfi_def_cfa 4, 4
	.cfi_restore 5
	ret
	.cfi_endproc
.LFE0:
	.size	_start, .-_start
	.ident	"GCC: (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1"
	.section	.note.GNU-stack,"",@progbits


Come si può notare, il codice è stato ricavato con gpp poi ho sostituito l'etichetta main con _start per compilare poi con "as".
 
Ultima modifica:
non ho esperienza di gpp e gdb ma a occhio e croce quel codice asm non fa niente.
Secondo me il compilatore ha usato qualche switch implicito che ottimizza il codice per cui siccome la chiamata sqrt non torna il valore a nessuna variabile, ovvero non serve a niente, la versione asm semplicemente NON contiene nessuna chiamata alla funzione sqrt!
se guardi infatti vedi forse qualcosa che fa riferimento a sqrt in asm? oppure vedi riferimenti al parametro "6" che la funzione dovrebbe utilizzare? no.

La risposta alla tua domanda, perchè c'è la riga :
movl $0, %eax
è semplice, le funzioni in C tornano un valore al chiamante caricandone il valore nel registro EAX,
nel tuo caso la funzione è la main, e il main deve tornare un valore come vedi dalla dichiarazione:
int main(...)
ovvero con valore restituito di tipo int.

Anche in questo caso il compilatore ha agito di "default" ovvero tu non hai messo "return(0);" ma ci ha pensato comunque lui a metterlo nell'asm.

Per curiosità, prova a mettere un return(1); in fondo al main
e vedi se quella riga cambia in
movl $1, %eax%

questa sarebbe la conferma
altrimenti ho sparato una serie di boiate :D
 
Stato
Discussione chiusa ad ulteriori risposte.