【发布时间】:2023-01-03 09:52:51
【问题描述】:
是否有任何汇编指令来对齐特定的堆栈数据变量?
例如,假设 MASM 函数具有这些具有初始值的局部变量
LOCAL beginStack:QWORD ; ffffffffdeadbeef
LOCAL myLocalA:QWORD ; ffffffffffffffff
LOCAL myLocalB:QWORD ; 0000000000000000
LOCAL myArrayA[10]:BYTE ; AAAAAAAAAA
LOCAL myArrayB[10]:BYTE ; BBBBBBBBBB
LOCAL endStack:QWORD ; ffffffffbaadf00d
内存堆栈具有此布局,但注意 endStack 未对齐
00000048`51effb60 baadf00d000906ec ; baadf00d
00000048`51effb68 42424242ffffffff ; ffffffff
00000048`51effb70 4141424242424242
00000048`51effb78 4141414141414141
00000048`51effb80 0000000000000000
00000048`51effb88 ffffffffffffffff
00000048`51effb90 ffffffffdeadbeef
为了对齐endStack,我尝试将局部变量与对齐pad[4]混合在一起
LOCAL beginStack:QWORD
LOCAL myLocalA:QWORD
LOCAL myLocalB:QWORD
LOCAL myArrayA[10]:BYTE
LOCAL myArrayB[10]:BYTE
LOCAL pad[4]:BYTE
LOCAL endStack:QWORD
正确对齐endStack
0000005b`950ff950 ffffffffbaadf00d ; aligned
0000005b`950ff958 42424242ffdaf38f ; pad[4] is ffdaf38f
0000005b`950ff960 4141424242424242
0000005b`950ff968 4141414141414141
0000005b`950ff970 0000000000000000
0000005b`950ff978 ffffffffffffffff
0000005b`950ff980 ffffffffdeadbeef
另一种方法(如果适用)是根据降序重新排列堆栈变量QWORD -> DWORD -> WORD -> BYTE
题
GCC 有这个__attribute__ ((aligned (8))) 来对齐变量,但是汇编语言有等效的方法吗?
它确实感觉像 C/C++ 等高级语言有一个很大的优化技巧工具箱,但不幸的是没有移植到较低级别的汇编语言。
【问题讨论】:
-
MASM 实际上有点不寻常,因为它有 LOCAL 指令来为您计算这些东西。对于大多数汇编程序,您将只需要手动计算堆栈帧偏移量并对其进行硬编码。通常,用汇编编写的要点是你想自己做所有的优化;汇编程序的工作是准确地编码您编写的内容,否则就不会妨碍您。