【问题标题】:ANDing the stack pointerANDing 堆栈指针
【发布时间】: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 个字节。

标签: c assembly 32-bit


【解决方案1】:

如果你用一个从 0x3 开始的堆栈指针重复你的数学运算,你会受到启发。

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

【讨论】:

  • 值得注意的是,这是有效的,因为堆栈向下增长。因此,与低位相加使 sp 指向未使用的堆栈内存。
猜你喜欢
  • 2013-01-20
  • 2015-11-16
  • 1970-01-01
  • 2014-10-16
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2017-06-06
相关资源
最近更新 更多