// Compilation :
// normal : gcc hello.c -o hello
// debug : gcc -ggdb3 hello.c -o hellodbg
// gdb hellodbg
// break main
// run
// next
// (entrée : répète dernière commande)
// help
// help running
// quit
//
// break addone
// run
// disassemble
// Dump of assembler code for function addone:
// 0x000000000040057e <addone+0>: push %rbp
// 0x000000000040057f <addone+1>: mov %rsp,%rbp
// 0x0000000000400582 <addone+4>: mov %rdi,0xfffffffffffffff8(%rbp)
// 0x0000000000400586 <addone+8>: mov 0xfffffffffffffff8(%rbp),%rax
// 0x000000000040058a <addone+12>: inc %rax
// 0x000000000040058d <addone+15>: leaveq
// 0x000000000040058e <addone+16>: retq
// Conclusion : Le paramètre est passé dans rdi
// La valeur de retour de la fonction est placée dans rax (registre 64 bits) #include <stdio.h>
extern long addone(long a);
extern long addtwo(long a);
int main(int argc, char** argv)
{
long a = 2012345678;
a *= a; // Pour obtenir un nombre sur 62 bits
long b;
long c;
printf("Hello, bonjour\n" );
printf("Bonne fête à tous les Eloi, en ce 1er décembre !\n" );
printf("\n" );
printf("a = %ld\n",a);
b = addone(a);
printf("b = addone(a) = %ld\n",b);
// Mettre en commentaire les deux lignes suivantes et compiler par les commandes situées en tête
// de fichier pour optenir les traces ci-dessus avec gdb
c = addtwo(a);
printf("c = addtwo(a) = %ld\n",c);
}
long addone(long a)
{
return a + 1;
}
|