Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to know where is the register variable stored?

Tags:

c

I knew that register variables are stored in CPU registers.

And the same variables are stored in stack if the CPU registers are busy/full.

how can i know that the variable is stored in stack or CPU register?

like image 764
Raghu Srikanth Reddy Avatar asked Dec 27 '12 10:12

Raghu Srikanth Reddy


2 Answers

I am agree with Mr. Unwind's answer, but upto some extend this way may be helpful to you:

file name x.c:

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

Assemble code:

~$ gcc x.c -S  

output file name is x.s.

In my case ebx register is used, which may be difference at different compilation time.

~$ 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    

You can also disassemble your executable using objdunp:

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

Partial assembly output using objdump command:

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 register reserved for register variable.

like image 103
Grijesh Chauhan Avatar answered Sep 22 '22 19:09

Grijesh Chauhan


No, you can't.

It's decided by the compiler, and might change between compilations if, for instance, the surrounding code changes the register pressure or if compiler flags are changed.

like image 33
unwind Avatar answered Sep 23 '22 19:09

unwind