Assembly NASM中.data部分中变量的对齐
使用Agner Fog的objconv的输出,我看到了这条评论的两个实例: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
; 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开头,但显然这还不足以防止某些变量的错位
我的问题是:
首先,您应该删除第一行中的打字错误:而不是
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上面的两个注释都是好主意。谢谢