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,它可能是次好的选择。
我正在尝试将宏从 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,它可能是次好的选择。