Assembly MASM中的当前地址运算符($)
我正在尝试编写一个ASM函数(在MASM中),它使用当前地址运算符($)将代码填充到NOPs,以便将代码对齐到32字节。我的具体问题是,我可以使用带$operator的表达式作为条件代码吗 例如,我的代码如下所示:Assembly MASM中的当前地址运算符($),assembly,operator-keyword,masm,Assembly,Operator Keyword,Masm,我正在尝试编写一个ASM函数(在MASM中),它使用当前地址运算符($)将代码填充到NOPs,以便将代码对齐到32字节。我的具体问题是,我可以使用带$operator的表达式作为条件代码吗 例如,我的代码如下所示: needed equ ( $ mod 32 ) if needed eq 1 db 090h elseif needed eq 2 db 66hh, 90h . . . else .err endif 当我编译/构建此代码时,会出现以下错误: error A2026
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字节(或其他字节)边界对齐
提前谢谢你的帮助 我已经很久没有使用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字节-32位似乎更合适(上面是32位;使用32代替4表示32字节)
在TASM(MASM兼容模式)下
将与4字节边界对齐
您的方法的问题是,$
是相对于代码段的。我假设MAIN
是程序的开始(或者至少是代码段的第一个字节…)
$-main
生成程序段开始的偏移量,因此它只是一个数字,相对于零。感谢您的建议。我相信ALIGN 32
用于数据对齐,而不是代码对齐。如果我错了,请纠正我。请告诉我什么是dup
指令,以及它如何将db 090H
命令与32字节对齐?非常感谢你。
ALIGN DWORD