【发布时间】:2020-04-16 21:35:12
【问题描述】:
使用 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 .rodata,而不是读写.data,这样您需要COWed的页面就更少了。 -
@fuz 和 Peter Cordes 上面的两个 cmets 都是好主意。谢谢。
标签: assembly optimization memory nasm memory-alignment