我查看了一些汇编代码转储,主函数中有这一部分(找到here和here):
<main+0>: push %ebp
<main+1>: mov %esp, %ebp
<main+3>: sub $0x8, %esp
<main+6>: and $0xfffffff0, %esp
<main+9>: mov $0x0, %eax
<main+14>: add $0xf, %eax
<main+17>: add $0xf, %eax
<main+20>: shr $0x4, %eax
<main+23>: shl $0x4, %eax
<main+26>: sub %eax, %esp
你能解释一下(main + 9)到什么(主+ 9)? 为什么这样做“低效”?
答案 0 :(得分:2)
所以你想要一个完整的步骤而不做自己的研究?听起来合法。
main + 9:mov $ 0x0,%eax
使用 hex 0 (= dec 0)加载寄存器eax
。
main + 14:添加$ 0xf,%eax
将 hex F (= dec 15)添加到eax
中的零。
main + 17:添加$ 0xf,%eax
再次将 hex F (= dec 15)添加到eax
。 这三条指令也是由
movl $0x1e, %eax
但谁在计算说明...无论如何,此时eax
包含 hex 1E ,即12月30日。
main + 20:shr $ 0x4,%eax
将eax
的内容向右移动四位。
main + 23:shl $ 0x4,%eax
向右移动eax
。为什么?因为这会清除最低的四位。现在eax包含 hex 10 (= dec 16)
main + 26:sub%eax,%esp
来自eax
的摘要esp
(堆栈指针)。由于
main + 6:和$ 0xfffffff0,%esp
先前清除了esp
中的低4位,新的esp
将按照ABI对齐16个字节。为什么不在main+6
之后简单地使用esp?因为在x86上,堆栈从内存顶部向向下增长。简单地掩盖esp
的低位可能会破坏局部变量。因此减法使堆栈向下增加到16字节边界。