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

时间:2014-01-16 02:45:48

标签: assembly operator-keyword masm

我正在尝试编写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字节(或其他字节)边界,请告诉我。 ?

提前感谢您的帮助。

1 个答案:

答案 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产生从程序段开始的偏移量,因此只是一个数字,相对于没有。