这个asm代码是什么意思&我该如何检查这些值?

时间:2012-09-22 14:22:22

标签: assembly gdb

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)

我想了解第3行。

$ 0x30?(常数0x30?或地址0x30?的值,如果那样,我怎么才能访问该值?如果输入'p * 0x30',则会发生错误。(这可以改变堆栈指针的值吗? ?&lt; - target是rsp?不是'$ 0x30'?)

并且

什么是-0x14(%rbp)??

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

$0x30是常量十六进制值30(十进制48)。该行的作用是从%esp中减去48,即堆栈指针 - 有效地将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寄存器通常包含一个数据字。