【问题标题】:How to get 16 byte aligned address in assembly如何在汇编中获得 16 字节对齐的地址
【发布时间】:2014-02-17 13:47:31
【问题描述】:

我必须将浮点寄存器保存到堆栈中。
我尝试使用 fsave 指令。
我执行以下操作:

fsave (%esp)

但作为参数 fsave 使用 16 字节对齐的地址。

我不知道如何使 %esp 中的地址对齐 16 字节。

【问题讨论】:

  • 并且低4位清零的地址按16字节对齐。
  • new=(old+0xF)&(~0xF);

标签: assembly stack memory-address memory-alignment fpu


【解决方案1】:

使用英特尔风格的语法:

    push    ebp             ;save ebp
    mov     ebp,esp         ;save esp in ebp
    and     esp,0fffffff0h  ;round esp down to 16 byte boundary
    sub     esp,128         ;allocate multiple of 16 bytes

【讨论】:

  • 这是半有用的建议;如果你在上面之后执行fsave (%esp),你将覆盖现有的堆栈。虽然您需要对齐堆栈指针,但不要忘记您也必须在此处分配堆栈...
  • 更新了代码示例。我的旧文档指出 fsave 最多可以保存 108 个字节,现在可能会更大。
猜你喜欢
  • 2021-04-15
  • 2023-04-08
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多