1
Dump of assembler code for function main:
0x0000000100000de6 <main+0>:    push   %rbp
0x0000000100000de7 <main+1>:    mov    %rsp,%rbp
0x0000000100000dea <main+4>:    sub    $0x30,%rsp
0x0000000100000dee <main+8>:    mov    %edi,-0x14(%rbp)
0x0000000100000df1 <main+11>:   mov    %rsi,-0x20(%rbp)
0x0000000100000df5 <main+15>:   movq   $0x0,-0x8(%rbp)
0x0000000100000dfd <main+23>:   cmpl   $0x2,-0x14(%rbp)

我想了解第三行。

$0x30 ?(constant 0x30? or the value of address 0x30 ? , if then, 如何访问该值?如果我键入 'p *0x30',则会发生错误。(这可以更改堆栈指针的值吗??<- - 目标是 rsp?不是 '$0x30'?)

-0x14(%rbp) 是什么?

(我使用 OSX)
谢谢你的提前。

4

2 回答 2

3

前两条指令是设置堆栈帧。然后按出场顺序:

<main+0>:    push   %rbp
<main+1>:    mov    %rsp,%rbp
<main+4>:    sub    $0x30,%rsp       ;reserves 48 bytes on the stack for local variables
<main+8>:    mov    %edi,-0x14(%rbp) ;stores %edi at the address that is less than %rbp by 20 bytes 
<main+11>:   mov    %rsi,-0x20(%rbp) ; stores %rdi at the address that is less than %rbp by 32 bytes
<main+15>:   movq   $0x0,-0x8(%rbp) ; clears the qword at -0x8(%rbp)
于 2012-09-22T14:33:27.797 回答
0

$0x30是恒定的十六进制值 30(十进制为 48)。该行的作用是从堆栈指针中减去 48 %esp- 有效地将 48 个字节推入堆栈(请记住,堆栈向下增长)。

-0x14(%rbp)是地址的值%rbp - 0x14- 在 C 术语中,它大致是

unisigned char *rbp; // this is the rbp register
unsidned long edi;
edi = *(unsigned long *)(rbp - 0x14) // this is the actual value.

请注意转换为字长 - CPU 寄存器通常保存一个字的数据。

于 2012-09-22T14:27:07.797 回答