我正在尝试将宏从MASM6移植到TASM5(在IDEAL模式下),我遇到了错误。宏本身汇编很好,但是当我尝试调用它时,我在汇编期间收到以下错误:
错误 xxx.asm(##)无法在表达式中使用宏名称:M_SWAP16
宏从文本宏中获取数值并执行字节交换。通常使用带有立即值的ops或在变量初始化期间调用宏。
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语句中。想法?
答案 0 :(得分:0)
不幸的是,至少根据上一篇官方文档,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,它可能是下一个最好的东西。