2017-02-25 185 views
0

我正在研究一个计算机系统检查问题,要求在程序中的各个点上的堆栈指针偏移量,我对如何设置堆栈帧感到困惑。我已经在32位和64位系统之间学习了几个星期的程序集,但是我还没有看过一条指令来指示栈指针。ANDing堆栈指针

有人可以解释这个服务的目的是什么,第四条指令后%esp的偏移量和我计算的%esp正确吗?我已经在代码中注释了我认为在每条指令之后偏移量的值。

main: 
0x0x0804848a <+0>: push %ebp     ;-0x4 
0x0x0804848b <+1>: mov  %esp, %ebp   
0x0x0804848d <+3>: and  $0xfffffff0, %esp ;[-0x4, -0x13] 
0x0x08048490 <+6>: sub  $0x20, %esp   ;[-0x24, -0x33] 
0x0x08048493 <+9>: movl $0xa, 0x1c(%esp)   
0x0x0804849b <+17>: movl $0xa, (%esp)   
0x0x080484a2 <+24>: call 0x804841d <r>  ;[-0x28, -0x37] 
+1

它意味着将sp设置为16字节对齐的地址。下一条指令现在分配8个整数。 –

+0

实际上是16个字节。 –

回答

2

如果你用从0x3开始的堆栈指针重复你的算术,你将会开悟。

对齐。许多类型的CPU需要对齐才能获得最佳性能或像SSE这样的向量指令才能工作。

+2

值得注意的是,这是因为堆栈向下增长。因此,取出较低的位使得sp指向未使用的堆栈内存。 –