【问题标题】:Does TASM allow a macro to be used as an operand?TASM 是否允许将宏用作操作数?
【发布时间】:2016-08-14 07:43:44
【问题描述】:

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

错误 xxx.asm(##) 不能在表达式中使用宏名: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 语句中。想法?

【问题讨论】:

    标签: macros tasm


    【解决方案1】:

    不幸的是,至少根据最新的官方文档,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,它可能是次优的。

    【讨论】:

    • 我同意它很丑。该限制还阻止您将宏移动到 EQU 语句中。这太糟糕了。您是否知道任何支持该级别宏功能的 TASM 兼容汇编程序? Lazy Assembler 似乎不完整且已被废弃。
    • 您可以使用上面的宏生成一次 EQU 行:“M_swap16_EXPRESSION ,88h”,然后在没有宏的任何其他地方使用该等价,例如“protocol_default DW IPPROTO_TCP”。在 TASM 5.3 和 TASM 5.4 (CodeGear) 上对其进行了测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2012-01-03
    • 2021-02-10
    • 2021-01-01
    • 2014-11-01
    • 2014-06-30
    相关资源
    最近更新 更多