与堆栈指针
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 这样的矢量指令才能正常工作。
我正在做一个计算机系统考试复习题,要求程序中不同点的堆栈指针偏移量,我对堆栈帧的设置方式感到困惑。几周来我一直在学习 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 这样的矢量指令才能正常工作。