5 votes

comment savoir où est stockée la variable de registre ?

Je savais que les variables de registre sont stockées dans les registres du CPU.

Et les mêmes variables sont stockées dans la pile si les registres du CPU sont occupés/pleins.

Comment puis-je savoir si la variable est stockée dans la pile ou dans le registre du CPU ?

6voto

unwind Points 181987

Non, tu ne peux pas.

C'est décidé par le compilateur, et peut changer entre les compilations si, par exemple, le code environnant change le pression du registre ou si les drapeaux du compilateur sont modifiés.

6voto

Grijesh Chauhan Points 28442

Je suis d'accord avec les propos de M. Unwind. réponse mais jusqu'à un certain point, cette méthode peut vous être utile :

nom du fichier x.c :

int main(){
    register int i=0; 
    i++;
    printf("%d",i);
} 

Assemblez le code :

~$ gcc x.c -S  

le nom du fichier de sortie est x.s .

Dans mon cas ebx est utilisé, qui peuvent être différents selon le moment de la compilation.

~$ cat x.s
    .file   "x.c"
    .section    .rodata
.LC0:
    .string "%d"
    .text
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    pushl   %ebx
    subl    $28, %esp
    movl    $0, %ebx
    addl    $1, %ebx             // because i++
    movl    $.LC0, %eax
    movl    %ebx, 4(%esp)
    movl    %eax, (%esp)
    call    printf
    addl    $28, %esp
    popl    %ebx
    movl    %ebp, %esp
    popl    %ebp
    ret    

Vous pouvez également désassemblez votre exécutable en utilisant objdunp :

$ gcc x.c -o x 
$ objdump x -d  

Sortie d'assemblage partiel en utilisant objdump commandement :

080483c4 <main>:
 80483c4:   55                      push   %ebp
 80483c5:   89 e5                   mov    %esp,%ebp
 80483c7:   83 e4 f0                and    $0xfffffff0,%esp
 80483ca:   53                      push   %ebx
 80483cb:   83 ec 1c                sub    $0x1c,%esp
 80483ce:   bb 00 00 00 00          mov    $0x0,%ebx
 80483d3:   83 c3 01                add    $0x1,%ebx          //due to i++
 80483d6:   b8 b0 84 04 08          mov    $0x80484b0,%eax
 80483db:   89 5c 24 04             mov    %ebx,0x4(%esp)
 80483df:   89 04 24                mov    %eax,(%esp)
 80483e2:   e8 0d ff ff ff          call   80482f4 <printf@plt>
 80483e7:   83 c4 1c                add    $0x1c,%esp
 80483ea:   5b                      pop    %ebx
 80483eb:   89 ec                   mov    %ebp,%esp
 80483ed:   5d                      pop    %ebp
 80483ee:   c3                      ret    
 80483ef:   90                      nop

%ebx registre réservé à la variable de registre.

3voto

SunEric Points 3464

Je suis aussi d'accord avec la réponse d'UnWind, d'un autre côté désassembler le code dans GDB peut donner le stockage des variables. En désassemblant un code vague que j'ai, on obtient les variables locales de cette trame comme ci-dessous,

 (gdb) info locals
 i = 0
 ret = <value optimized out>
 k = 0
 ctx = (BN_CTX *) 0x632e1cc8
 A1 = (BIGNUM *) 0x632e1cd0
 A1_odd = (BIGNUM *) 0x632e1ce8
 check = <value optimized out>
 mont = (BN_MONT_CTX *) 0x632e2108
 A = (const BIGNUM *) 0x632e2028

Maintenant, si j'essaie d'imprimer l'adresse des locaux, cela m'indique l'emplacement de stockage comme ci-dessous,

 (gdb) p &i
 $16 = (int *) 0x143fba40
 (gdb) p &k
 $17 = (int *) 0x143fba38
 (gdb) p &mont
 Address requested for identifier "mont" which is in register $s7
 (gdb)

Ici, les objets i y k sont sur la pile et mont est dans le registre $s7.

2voto

Ron Nuni Points 188

Selon le livre "The Ansi C Programming Language - Second Edition" de Brian W. Kernighan & Dennis M.Ritchie (les fondateurs des langages C), vous ne pouvez pas .

Chapitre 4, page 84,

"... Et il n'est pas possible de prendre l'adresse d'une variable de registre, indépendamment du fait que la variable soit effectivement placée dans un register ."

J'espère que cela vous aidera ! Bonne chance pour l'avenir, Ron

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X