如何知道寄存器变量存储在哪里?

Rag*_*ddy 5 c

我知道寄存器变量存储在CPU寄存器中.

如果CPU寄存器忙/满,则相同的变量存储在堆栈中.

我怎么知道变量存储在堆栈或CPU寄存器中?

unw*_*ind 6

不,你不能.

它由编译器决定,并且可能在编译之间发生变化,例如,如果周围的代码改变了寄存器压力或者编译器标志被更改了.

  • 只是有点迂腐,问题确实说他怎么知道,而不是他怎么能控制它.我同意Greg Hewgill的评论,你可以从汇编程序输出中确定. (3认同)

Gri*_*han 6

我同意Unwind先生的回答,但在某种程度上,这种方式可能对您有所帮助:

文件名x.c:

int main(){
    register int i=0; 
    i++;
    printf("%d",i);
} 
Run Code Online (Sandbox Code Playgroud)

汇编代码:

~$ gcc x.c -S  
Run Code Online (Sandbox Code Playgroud)

输出文件名是x.s.

在我的情况下使用ebx寄存器,这可能在不同的编译时间有所不同.

~$ 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    
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下命令反汇编可执行文件objdunp:

$ gcc x.c -o x 
$ objdump x -d  
Run Code Online (Sandbox Code Playgroud)

使用objdump命令输出部分程序集:

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
Run Code Online (Sandbox Code Playgroud)

%ebx 寄存器保留为寄存器变量.