2014-10-05 182 views
1

我对我的计算机体系结构教科书中的这个示例程序感到困惑。Y86总和程序混淆

这里的C代码...

enter image description here

而这里的生成Y86代码...

enter image description here

我的问题是与0x046

mrmovl 8(%ebp), %ecx 

为什么它设置开始到堆栈指针前面的8个字节?我认为我对所有事情都很困惑。就像堆栈正在查看0x100一样,为什么%ecx被设置为8个字节,然后当Count已经被设置为远离%ebp12个字节时增加4?我对堆栈指针所看到的东西的理解可能是错误的。

回答

1

代码东西推到堆栈中的顺序如下:

  • Count4
  • Startarray
  • 返回%eip(由call隐含推动);
  • %ebp

的代码,然后将%ebp%esp,堆栈看起来是这样的:(你的主要兴趣在部分标注%EBP及以上)

stack layout

希望这澄清事情。你可以阅读更多here

+0

哦,我想我明白了,因为* Start是第三个被推入堆栈的东西,所以我们需要移过最新的和第二个最新的东西(每个4个字节)以开始*开始字节。 *起始字节包含数组的地址,_that_正在增加4.另外一件事,在程序结束时,他们将堆栈设置为.pos 100.因此,假设您将4个字节推送到堆栈,在地址100-103或0FD - 100? – Weston 2014-10-05 07:34:54