我正在尝试编写ASM函数(在MASM中),该函数使用当前地址运算符($)来填充带有NOP的代码,以便将代码与32字节对齐。我的具体问题是,我可以使用带有$运算符的表达式来表示条件代码吗?
例如,我的代码如下所示:
needed equ ( $ mod 32 )
if needed eq 1
db 090h
elseif needed eq 2
db 66hh, 90h
.
.
.
else
.err
endif
编译/构建此代码时,我发出以下错误:
error A2026: constant expected
error A2052: forced error
第一个错误是指以下行:
if needed eq 1
如果$(当前地址运算符)可以在条件表达式中以这种方式使用,和/或是否有另一种/更好的方法将代码对齐到32字节(或其他字节)边界,请告诉我。 ?
提前感谢您的帮助。
答案 0 :(得分:0)
自从我使用MASM以来很长一段时间 - 但也许
ALIGN 32
可能会奏效。
或者
db 090H dup (32 - ($ mode 32))
或 db 090H dup((32 - ($ mode 32))mod 32)
试过这个 - 但是我使用TASM
所以可能需要勾选...
NOPS EQU (4-(($-main)mod 4)) mod 4
if (NOPS NE 0)
db NOPS mod 4 dup (90H)
endif
不确定为什么你想要32-BYTE-32-bit似乎更合适(上面是32-BIT;用32代替4代表32字节)
在TASM(MASM兼容模式)
ALIGN DWORD
将与4字节边界对齐。
您的方法存在的问题是$
与code_segment相关。我假设MAIN
是程序的开头(或代码段的第一个字节,至少......)
$-main
产生从程序段开始的偏移量,因此只是一个数字,相对于没有。