【问题标题】:Align in assembly x86在汇编 x86 中对齐
【发布时间】:2020-12-04 11:33:32
【问题描述】:

我无法理解align
我尝试运行以下命令:

section .data
align 4
xs: dw 0xA1A2
ys: db 0xB1, 0xB2, 0xB3, 0xB4

看看每个字节是什么,我希望它是内存中的一个连续块,如下所示:

           for instance:    4      5    6    7     8    9     A     B
    (addr divisible by 4):[0xA2, 0xA1, 0x0, 0x0, 0xB1, 0xB2, 0xB3, 0xB4]

为了让ys的地址能被4整除 相反,它更像是:

                            4      5    6      7     8    9     
    (addr divisible by 4):[0xA2, 0xA1, 0xB1, 0xB2, 0xB3, 0xB4]

显然我对 align 的工作原理有一个误解。有谁能帮我解惑?

【问题讨论】:

  • 你知道dw是一个2字节的“单词”,对吧?你会从 dd 0xa1a2 得到你所期望的,它的高 2 个字节为零。

标签: assembly x86 nasm memory-alignment


【解决方案1】:

要得到你想要的,你需要在ys 数据前面直接放置一个align 指令。此外,要让它使用零字节作为对齐数据,您必须明确指定它。 (默认为 90h nop。)像这样:

section .data
align 4, db 0
  xs: dw 0xA1A2
align 4, db 0
  ys: db 0xB1, 0xB2, 0xB3, 0xB4

这是因为指令不是的意思是“向前,将所有数据对齐到这个边界”。它的意思是,“在这个特定点将发出的数据与这个边界对齐一次”。

【讨论】:

  • @sadElephent:编辑添加解释。
  • 或者更机械地说,您可以将align 视为“在此处发出填充,直到当前位置与请求的对齐方式对齐。”这更清楚地表明它根本不与后面的行交互,它只是自行扩展。
猜你喜欢
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多