与堆栈指针

ANDing the stack pointer

我正在做一个计算机系统考试复习题,要求程序中不同点的堆栈指针偏移量,我对堆栈帧的设置方式感到困惑。几周来我一直在学习 32 位和 64 位系统之间的汇编,但我之前没有看到 AND 堆栈指针的指令。

谁能解释一下这有什么用,第四条指令后%esp的偏移量是多少,我正确计算了%esp?我已经用我认为每条指令之后的偏移值对代码进行了注释。

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

如果你用从 0x3 开始的堆栈指针重复你的数学运算,你就会开悟。

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