Assembly NASM中.data部分中变量的对齐

Assembly NASM中.data部分中变量的对齐,assembly,optimization,memory,nasm,memory-alignment,Assembly,Optimization,Memory,Nasm,Memory Alignment,使用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=1

使用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开头,但显然这还不足以防止某些变量的错位

我的问题是:

  • 我如何知道(不使用反汇编程序)内存操作数在.data节中未对齐?我可以计算声明前面的字节数,但手动计算会很繁琐,尤其是在未对齐变量前面有许多声明的情况下

  • 在每个数据声明之前加上ALIGN指令是否有用


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

    section. data align=16
    
    应该是

    section .data align=16
    
    Ad 1:您可以通过显示符号表的工具轻松检查所有命名内存操作数的偏移量。如果将源代码组装到COFF for Windows,请使用

    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
    
    符号的偏移位于列值中


    Ad 2:否。按照@fuz的建议,将内存变量放入.data或.rodata部分,按对齐要求降序排序(字符串为最后一个)。这将使程序更短。

    校准请求仅对齐段的开头。如果要对齐符号,则需要在符号之前使用单独的对齐指令。通常情况下,我会对变量进行排序,使相同大小的变量彼此相邻,以便它们都对齐。然后,对于一系列变量,只有一个对齐指令就足够了。另外,将字符串常量放在
    部分.rodata
    中,而不是读写
    .data
    ,这样您就少了需要压缩的页面。@fuz和Peter Cordes上面的两个注释都是好主意。谢谢