NASM中.data节中的变量对齐

问题描述 投票:1回答: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开头,但是显然这不足以防止某些变量未对齐。

我的问题是:

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

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

assembly optimization memory nasm memory-alignment
1个回答
0
投票

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

section. data align=16

应该是

section .data align=16

Ad 1:您可以使用某种显示符号表的工具轻松地检查所有命名的内存操作数的偏移量。如果将源汇编为Windows的COFF,请使用

PEVIEW.EXE RTC222.obj

如果已组装到Linux的ELF,请使用

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节中,按其对齐要求的降序排列(最后一个字符串)。这会使程序更短。

© www.soinside.com 2019 - 2024. All rights reserved.