NASM中.data部分的变量对齐



使用Agner Fog的objconv的输出,我看到了这个注释的两个实例:

; Note: Memory operand is misaligned. Performance penalty

这可以通过在数据声明之前使用ALIGN16来解决,例如:

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. data align=16

应该是

section .data align=16

Ad 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

符号的偏移量在"值"列中。

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

最新更新