im juste curieux sur l'exemple suivantC - Quelle est la valeur de retour d'un point-virgule?
#include<stdio.h>
int test();
int test(){
// int a = 5;
// int b = a+1;
return ;
}
int main(){
printf("%u\n",test());
return 0;
}
i compilé avec gcc -Wall -o semicolon.c virgule 'pour créer un exécutable et gcc -Wall S semicolon.c' pour obtenir le code assembleur qui est:
.file "semicolon.c"
.text
.globl test
.type test, @function
test:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
leave
ret
.size test, .-test
.section .rodata
.LC0:
.string "%u\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $20, %esp
call test
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
movl $0, %eax
addl $20, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
depuis je ne suis pas un tel pro assembleur, je ne sais que des impressions printf ce qui est dans eax , mais je ne comprends pas bien ce que « movl% eax, 4 (% esp) » moyens Je suppose remplit eax avant d'appeler le test mais quelle est la valeur alors? ce qui signifie 4 (% esp) et que signifie la valeur de ESP?
si je décommenter les lignes test() imprime printf 6 - qui est écrit dans eax ^^
bonne explication. pour ajouter plus d'informations sur ce sujet, il semble que eax et son utilisation sur passer la valeur à travers la pile est similaire pour les types de données simples (int, double, char, void *, ...) mais comme il entre dans des structures plus de la gestion de la mémoire des compilateurs entre en jeu. Je ne sais pas encore ce qui se passe sur la pile dans le cas de structures pour comprendre le retour vide sur des fonctions non vides qui devraient renvoyer une structure, mais c'est une question/réponse plus complexe. de toute façon - thx –
@John: à peu près la même chose arrive avec des structures qu'avec 'int's et' float's. Il s'appelle _stack trash_. Quoi qu'il arrive d'être dans la mémoire que l'appelant a réservé pour la valeur de retour est ce qui est retourné. –