【发布时间】:2017-02-25 15:35:55
【问题描述】:
我正在处理一个计算机系统考试复习题,询问程序中各个点的堆栈指针偏移量,我对堆栈帧的设置方式感到困惑。几周以来我一直在学习 32 位和 64 位系统之间的汇编,但我之前没有看到过 AND 堆栈指针的指令。
有人能解释一下这个服务的目的是什么,在第四条指令之后%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]
【问题讨论】:
-
表示设置sp为16字节对齐的地址。下一条指令现在分配 8 个整数。
-
实际上是 16 个字节。