【问题标题】:Alignment of variables in the .data section in NASMNASM 中 .data 部分中的变量对齐
【发布时间】:2020-04-16 21:35:12
【问题描述】:

使用 Agner Fog 的 objconv 的输出,我看到了此评论的两个实例:

; Note: Memory operand is misaligned. Performance penalty

这可以通过在数据声明前加上 ALIGN 16 来解决,例如:

section. data align=16
data_1: dq 0
data_2: dq 0
str_var: db "This is a string",0x00
ALIGN 16
MQX_Dcc: dq 0

我的数据部分以 align=16 开头,但显然这不足以防止某些变量错位。

我的问题是:

  1. 我如何知道(不使用反汇编程序)内存操作数在 .data 部分中未对齐?我可以计算声明之前的字节数,但是手动操作很乏味,尤其是当未对齐变量之前有许多声明时。

  2. 在每个数据声明之前都使用 ALIGN 指令是否有用?

【问题讨论】:

  • 对齐请求仅对齐段的开头。如果要对齐符号,则需要在符号之前使用单独的对齐指令。通常我对我的变量进行排序,使它们具有相同大小的变量彼此相邻,因此它们都对齐。然后,对于一系列变量,只有一个对齐指令就足够了。
  • 另外,将字符串常量放入section .rodata,而不是读写.data,这样您需要COWed的页面就更少了。
  • @fuz 和 Peter Cordes 上面的两个 cmets 都是好主意。谢谢。

标签: assembly optimization memory nasm memory-alignment


【解决方案1】:

首先,您应该删除第一行中的错字:而不是

section. data align=16

应该是

section .data align=16

广告 1: 您可以通过一些显示符号表的工具轻松检查所有命名内存操作数的偏移量。如果您将源代码组装到 Windows 的 COFF,请使用

PEVIEW.EXE RTC222.obj

如果是编译成ELF for Linux,使用

readelf -s RTC222.o

Symbol table '.symtab' contains 7 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS RTC222.asm
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1
     3: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 data_1
     4: 0000000000000008     0 NOTYPE  LOCAL  DEFAULT    1 data_2
     5: 0000000000000010     0 NOTYPE  LOCAL  DEFAULT    1 str_var
     6: 0000000000000030     0 NOTYPE  LOCAL  DEFAULT    1 MQX_Dcc

符号的偏移量在值列中。

广告 2: 不。按照@fuz 的建议,将内存变量放入 .data 或 .rodata 部分,按其对齐要求降序排列(字符串排在最后)。这将使程序更短。

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多