2016-08-14 6 views
0

MASM6からTASM5に(IDEALモードで)マクロを移植しようとしていますが、エラーが発生しています。マクロ自体はうまく組み立てが、私はそれを呼び出すようにしようとしたとき、私は、組み立て時に次のエラーが表示されます式でマクロ名を使用することはできませんTASMはマクロをオペランドとして使用できますか?

エラー 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

残念ながら、TASM5は、結果を少なくとも最後の公式ドキュメントに従って式に返すマクロをサポートしていないようです。これはまたあなたが見ているエラーが何を言っているのかです。より具体的には、EXITMディレクティブはあなたのモードにかかわらずMASMのような引数を取ることはありませんが、TASMのマクロは引き続き1行のコードを出力できるので、マクロを式に渡すことを心配しなければ、私は次の回避策(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

上記のマクロを使用して、 "M_swap16_EXPRESSION 、88h"というEQU行を一度生成し、それを "protocol_default DW IPPROTO_TCP"のようなマクロなしで他の場所と同じように使用できます。 TASM 5.3とTASM 5.4(CodeGear)でテスト済み – byteptr

関連する問題