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)
谢谢你提前。
答案 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寄存器通常包含一个数据字。