为什么这个函数序言使用几个指令来计算esp减少?

时间:2014-01-13 16:46:17

标签: gcc assembly x86

我查看了一些汇编代码转储,主函数中有这一部分(找到herehere):

<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)? 为什么这样做“低效”?

1 个答案:

答案 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字节边界。