使用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:您可以使用某种显示符号表的工具轻松地检查所有命名的内存操作数的偏移量。如果将源汇编为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节中,按其对齐要求的降序排列(最后一个字符串)。这会使程序更短。