TASM 是否允许将宏用作操作数?

Does TASM allow a macro to be used as an operand?

我正在尝试将宏从 MASM6 移植到 TASM5(在 IDEAL 模式下),但我遇到了错误。宏本身可以很好地组装,但是当我尝试调用它时,我在组装过程中收到以下错误:

Error xxx.asm(##) Can't use macro name in expression: M_SWAP16

宏从文本宏中获取数值并执行字节交换。通常使用取立即值的操作或在变量初始化期间调用宏。

MACRO M_swap16 operand
 LOCAL result
 result = (((operand and 0FFh) shl 8) or ((operand and 0FF00h) shr 8))
 exitm %result
ENDM

IPPROTO_TCP EQU 6
.
.
.
mov  [protocol], M_swap16(IPPROTO_TCP)   ; fails
.
.
.
protocol  DW  ?
protocol_default  DW  M_swap16(IPPROTO_TCP)  ; fails

它在 MASM 6.11 中运行良好。将 TASM 从 IDEAL 模式切换到 MASM 模式没有帮助。将宏移动到 EQU 语句中也没有。想法?

不幸的是,至少根据最新的官方文档,TASM5 似乎不支持将结果返回到表达式的宏。这也是您看到的错误所说的内容。更具体地说,无论您处于何种模式,EXITM 指令都不会像 MASM 那样接受参数。但是 TASM 的宏仍然可以发出一行代码,所以如果您不担心将表达式传递给宏,我提出以下解决方法(IDEAL 模式):

MACRO M_swap16_EXPRESSION expr,operand
  LOCAL result
  result = (((operand and 0FFh) shl 8) or ((operand and 0FF00h) shr 8))
  expr result
ENDM

上面的宏将一个附加参数 "expr" 作为第一个参数,它是您试图插入原始表达式的汇编表达式。它将对操作数执行汇编时算术并发出总装线。可以这样使用:

M_swap16_EXPRESSION <mov [protocol],>,IPPROTO_TCP
...
M_swap16_EXPRESSION <protocol_default DW>,IPPROTO_TCP

我承认它很丑,但如果你必须使用 TASM,它可能是次好的选择。