2016-08-14 22 views
0

我正试图从MASM6端口宏到TASM5(在IDEAL模式),我遇到错误。宏本身装配精细,但当我尝试调用它,我在组装过程中收到以下错误:TASM是否允许将宏用作操作数?

错误 xxx.asm(##)在表达不能使用宏名称:M_SWAP16

该宏从文本宏中获取数字值并执行字节交换。一般通过ops来调用宏,该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

不幸的是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。

+0

我同意这是丑陋的。限制还可以防止您将宏移动到EQU语句中。这太糟糕了。你是否知道任何TASM兼容的汇编程序都支持这种级别的宏功能?懒惰的汇编程序看起来不完整并被放弃。 – toejam

+0

您可以使用上面的宏来生成一次EQU线:“M_swap16_EXPRESSION ,88h”,然后在没有宏的地方使用它,例如“protocol_default DW IPPROTO_TCP”。在TASM 5.3和TASM 5.4(CodeGear)上进行测试 – byteptr