x86汇编中的对齐

4

我对 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的工作方式存在误解。 有人能否帮忙澄清一下?


1
你知道 dw 是一个2字节的“词”吗?使用 dd 0xa1a2 可以得到你期望的结果,其高2字节为零。 - Peter Cordes
1个回答

4
为了达到你想要的效果,你需要在ys数据前面直接加上一个align指令。此外,为了使其使用零字节作为对齐数据,你必须明确指定。 (默认值为90h nop.) 就像这样:
section .data
align 4, db 0
  xs: dw 0xA1A2
align 4, db 0
  ys: db 0xB1, 0xB2, 0xB3, 0xB4

这是因为该指令并意味着“从现在开始,将所有数据都对齐到这个边界”。它的实际含义是,“在这个特定点,将发射的数据对齐到这个边界一次”。

@sadElephent:编辑以添加解释。 - ecm
2
甚至更机械地说,你可以把align看作是“在当前位置对齐到所请求的对齐方式之前,发出填充”。这使得它更加清晰,它根本不与后面的行交互,它只是扩展自己。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接