Assembly MASM中的当前地址运算符($)

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

我正在尝试编写一个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: 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