¿Cómo saber dónde está almacenada la variable de registro?

Sabía que las variables de registro se almacenan en los registros de la CPU.

Y las mismas variables se almacenan en la stack si los registros de la CPU están ocupados / llenos.

¿Cómo puedo saber que la variable está almacenada en la stack o en el registro de la CPU?

Estoy de acuerdo con la respuesta del Sr. Unwind, pero hasta cierto punto puede ser útil para usted:

nombre de archivo xc :

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

Código de assembly:

 ~$ gcc xc -S 

el nombre del archivo de salida es xs .

En mi caso se utiliza el registro ebx , que puede ser una diferencia en el momento de la comstackción diferente.

 ~$ cat xs .file "xc" .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 

También puedes desarmar tu ejecutable usando objdunp :

 $ gcc xc -ox $ objdump x -d 

Salida parcial del ensamblaje usando el comando objdump :

 080483c4 
: 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 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 registro reservado para registro variable.

No, no puedes.

Lo decide el comstackdor, y puede cambiar entre comstackciones si, por ejemplo, el código circundante cambia la presión del registro o si se cambian las banderas del comstackdor.

También estoy de acuerdo con la respuesta de Desenrollar, por otra parte, desensamblar el código en GDB puede dar el almacenamiento de las variables. Desmontando un código vago que tengo para los locales de ese marco como se muestra a continuación,

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

Ahora, si intenta imprimir la dirección de los locales, me dice la ubicación de almacenamiento como se muestra a continuación,

  (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) 

Aquí los objetos i y k están en la stack y mont está en el registro $ s7.

Según el libro “El lenguaje de progtwigción Ansi C – Segunda edición” de Brian W. Kernighan y Dennis M.Ritchie (Los fundadores de los lenguajes C), no se puede .

Capítulo 4, página 84,

“… Y no es posible tomar la dirección de la variable de registro, independientemente de si la variable se encuentra realmente en un register “.

¡Espero que ayude! La mejor de las suertes en el futuro, Ron.