1

PIC16F84のアセンブリでIF().... ELIF .... ENDIFをシミュレートしようとしましたが、複数回使用しても機能しないようです。このようなものを2箇所で使用しようとしましたが、ラベルが重複しているというエラーが発生します。マクロのパラメーターもラベルで置き換える必要がありますか?(true_nameの名前:)

_f macro name
  btfsc EQUAL,0
  goto true_name
  goto false_name
  true_name:
endm

_lse macro name
  goto next_name
  false_name:
endm

_ndif macro name
  goto next_name
  next_name:
endm

;; usage example
_f label1
  ...
_lse label1
  ...
_ndif 
4

3 に答える 3

1

もう少し上手くできると思います。これは、5つの深さでネストできるif-else-endifマクロです。残念ながら、if1、if2 ..の定義は、アセンブラが「#ifndef if#v(lvl)」を受け入れないため、希望どおりに作成できませんでした。そのため、マクロはそのままでネストレベルを5に制限します。深い。これらの記号は、特定のネストレベルでのIfの数をカウントするため、一意のラベルを付けることができます。ナンセンスな例が含まれています。

xIf macro L,R,A

#ifndef lvl
lvl=0
#endif
lvl=lvl+1

#ifndef if1
if1=0
if2=0
if3=0
if4=0
if5=0
#endif

if#v(lvl)=if#v(lvl)+1

    movf    R,A
    xorlw L
    bnz   _false_#v(lvl)_#v(if#v(lvl))
    endm 

xElse macro
    bra  _end_#v(lvl)_#v(if#v(lvl))
_false_#v(lvl)_#v(if#v(lvl)):
    endm

xEndIf macro
_end_#v(lvl)_#v(if#v(lvl)):
lvl=lvl-1
    endm

    xIf 123,STATUS,A
        clrf    TMR3H,A
        xIf 75,STATUS,A
            clrf    TMR3H,A
        xElse
            setf    TMR3L,A
        xEndIf
    xElse
        setf    TMR3H,A
    xEndIf
于 2012-10-25T01:34:53.280 に答える
0

あるマクロから別のマクロへのジャンプは使用しないでください。危険です。

一意のラベルを使用する必要はありません。 MPLABでこれを行うには2つの方法があります。

1)LOCALディレクティブの場合

_f macro name
 LOCAL true_name
      btfsc   EQUAL,0
      goto    true_name
      goto    name  
true_name:
endm

2)現在のメモリアドレスポインタとして$を使用する場合。

_f macro name
      btfsc   EQUAL,0
      goto    $+1
      goto    name
endm
于 2011-03-29T19:47:54.527 に答える
0

MPLAB変数でこの問題を解決しました。レジスタとリテラルの同等性をテストする例を次に示します。

_f_equal_literal macro register,literal,name
    movlw literal
    subwf register,0
    btfss STATUS,2 ;bit indicating result is zero
    goto _false#v(name)
    endm

_lse macro name
    goto _next#v(name)
_false#v(name):
    endm

_ndif macro name
_next#v(name):
    endm

goto _true#v(name)私が使用して_true#v(name):ラベルを付けていないことに注意してください。必要btfssかどうかを判断する必要がありますbtfsc

単一のマクロと、ステートメント用の複数のマクロを持つことが_lseできます_ndif_f

GJのソリューションにはnextラベルがないため、trueブランチはfalseブランチを実行します。


if-else-endif構文ごとに変数を定義する必要があります。変数名がif-else-endifの使用目的を説明していると、さらに役立つ場合があります。

例:

変数testing_something=123

_f_equal_literal some_register,some_value,testing_something
                ...       

_lse testing_something
                ...        

_ndif testing_something
于 2011-03-31T10:35:05.643 に答える