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

时间:2016-08-14 07:43:45

标签: macros tasm

我正在尝试将宏从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语句中。想法?

1 个答案:

答案 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,它可能是下一个最好的东西。