2016-05-02 26 views
2

これは少し愚かな構文質問かもしれませんが、変数タイプに基づいて条件付きジャンプを行う方法がありますか?私は引数としてバイト、単語、またはダブルワードを取って画面に書き込むことができるマクロ(クラス用)を書き込もうとしています。アセンブリの変数型をどのように比較しますか?

mWriteInt MACRO integer:REQ 
    ;cmp integer, DWORD 
    ;je dwordOp 
    movsx eax, word ptr integer 
    call WriteInt 
    mov edx, OFFSET endl 
    call WriteString 
; for a DWORD 
; dwordOp: 
ENDM 

基本的に、実行されるコードは、マクロに渡される変数のタイプに応じて異なる必要があります。どのようにこれを実行しようとしても、コンパイラエラーが発生します。

cmp integer, DWORD 
cmp TYPE integer, DWORD 

と私は本当にここからどこへ行くかわからない:

は、私が試してみました。私は、私は考えることができるすべての参照で見てきたが、普通の事

編集していないようです:OPATTRオペレータがあるMASMで

mWriteInt MACRO integer:REQ 
    IF (TYPE integer EQ TYPE DWORD) 
     call WriteInt 
    ENDIF 

    IF (TYPE integer EQ TYPE BYTE) 
     call WriteInt 
    ENDIF 

    IF (TYPE integer EQ TYPE WORD) 
     movsx eax, word ptr integer 
     call WriteInt 
    ENDIF 

     mov edx, OFFSET endl 
     call WriteString 
ENDM 
+2

あなたは、通常の比較を行い、あなたがIFのようなディレクティブを使用したいCPU命令を使用することはありません。 –

+0

MASMのIFディレクティブは、Cのif文と同じように動作しません。https://msdn.microsoft.com/en-us/library/4bd8b239.aspx –

+0

これは、LOLを投稿する前にグーグルで行うべきことです。私はもう一度試しましたが、エラーはなく実行されますが、動作していないようです。どんなタイプを渡しても、コードは決して実行されないようです。 –

答えて

4

Returns a word defining the mode and scope of expression. The low byte is identical to the byte returned by .TYPE. The high byte contains additional information.

次のように値は、here at the MASM forumを参照MASM Basicソースコードから取ら:the MASM referenceから引用

;  OPATTR guide 
;  Bit Set If... 
;  0  References a code label 
;  1  Is a memory expression or has a relocatable data label 
;  2  Is an immediate expression 
;  3  Uses direct memory addressing, i.e. is an absolute memory reference 
;  4  Is a register expression 
;  5  References no undefined symbols and is without error 
;  6  References a stack location (usually a LOCAL variable or parameter) 
;  7  References an external label 
;  8-10 Language type (000=no type) 
;   000 - no language type 
;   001 - C/C++ language type 
;   010 - SYSCALL language type 
;   011 - STDCALL language type 
;   100 - Pascal language type 
;   101 - FORTRAN language type 
;   110 - BASIC language type 

使用のいくつかの例が記載されている:

atMemory  = 34  ; 00100010  ; [edx+20], [ebx+20], [eax+edx+20], JWasm: [eax+4*eax+20], [eax+20] 
atImmediate = 36  ; 00100100 
atLabel  = 37  ; 10100101 
atOffset  = 38  ; 10100110  ; offset CrLf$ (immediate and mem expression) 
atGlobal  = 42  ; 10101010  ; CrLf$, Masm: [eax+4*eax+20], [eax+20] 
atRegLabel = 43  ; 10101011  ; Masm: [eax+start] (Jwasm yields 37) 
atRegister = 48  ; 00110000  ; also xmm 
atXmm   = 77  ; xxxxxxxx  ; reg starting with x 
atLocal  = 98  ; 01100010  ; [esp+20], [ebp+20] 

例あなたのMACROコードは

0123です

このMACROコードが期待通りのものでない場合は、ビット値を組み合わせてOPATTRの値を調整できます。

IFの二つの変種の間MASMの違いを記述するために追加するための一つのこと:

IF --- is compile time comparison 
.IF --- is runtime comparison 
+0

うわー、それは信じられないほど徹底的な答えです。あなたが言っていることは私にとって理にかなっていますが、コードを正確に追加しても同じ結果が得られます(最後のBYTEプリントのみ)。私はそれを通過している方法に何か問題がありますか?私は呼び出しています:mWriteInt [edi]、コード内にifステートメントがないときにはうまく動作します –

+2

これはエラーのルートになる可能性があります: 'mWriteInt [edi]'を呼び出しています。 '[edi]'は不特定のサイズを持ちます。これは 'dword ptr [edi]'、 'word ptr [edi]'または 'byte ptr [edi] 'のショートカットです。 'mov al、[edi]'はBYTEサイズを、 'mov eax、[edi]'はそれぞれDWORDサイズを推定するので、あなたはおそらくこのショートカットに慣れているでしょう。しかし、MACROのサイズで区別したい場合は、サイズを指定する必要があります。そうしないと、すべての可能性が一致するため、OPATTRでは決定できません。 – zx485

+0

本当にありがとう、あなたは素晴らしいです!それは私の問題を完全に解決した –

関連する問題