2016-08-06 80 views
-3

命令JSRを使用している68kアセンブリ言語命令RTSで問題が発生しました。 D0のデータを01と比較しようとしています。01の場合はValueIs01に分岐し、D0のデータと02を比較し、02の場合はValueIs02に分岐しますRTS命令(68kアセンブリ言語)

CMP.B #$01, D0 
    JSR ValueIs1 

    CMP.B #$02, D0 
    JSR ValueIs2 

ValueIs1: 
    MOVE.B #$00, D1 
    RTS 
Valueis2: 
    MOVE.B #$01, D1 
    RTS 

誰もがこのためのソリューションを持っています。しかし、それだけで完全にValueis1Valueis2ラベルに指示を無視されているように見えるが、ここでのコードはありますか?

答えて

3

IIRC、JSRはジャンプサブルーチン、RTSはサブルーチンからのリターンです。だから彼らは無条件の関数呼び出しと戻り命令であり、どのフラグが設定されているか気にしません。 This tutorial shows how they work (and maybe has more parts that say something about conditional branches).これはm68k rtsの最初のGoogleのヒットだったので、この種のものは正確に見つけるのが難しくありません。

コード内の命令のいずれも条件付きではないため、入力データに関係なく同じ命令シーケンスが実行されます。


それだけで完全にそう思わValueis1とValueis2ラベル

の命令を無視することのようです。どちらも実行する必要があります。

デバッガでコードをシングルステッピングすると、何が起こるかが正確に表示されます。条件分岐命令を追加するとロジックが正しくなるようになります。

3

コードでは、ValueIs1の後とValueIs2の実行後の両方で、JSRは条件付きのSubRoutineへのジャンプではないため、常にジャンプします。
実際には、たとえば次のように条件分岐を使用する必要があります。

CMP.B #$01, D0 
    BNE.S ValueIsNot1 
    MOVE.B #$00, D1 
    BRA.S EndOfCode 
ValueIsNot1: 
    CMP.B #$02, D0 
    BNE.S EndOfCode 
    MOVE.B #$01, D1 
EndOfCode: 
関連する問題