2016-08-06 9 views
-3

У меня возникли проблемы с инструкцией по языку ассемблера 68k RTS, работающей с инструкцией JSR. Я пытаюсь сравнить данные в D0 с номером 01, а если он равен 01, разветвиться до ValueIs01, если он не будет затем сравнивать данные в D0 с номером 02, а если он равен 02, разветвиться до ValueIs02 , но это, кажется, просто полностью игнорируя инструкции в Valueis1 и Valueis2 этикеток, вот код:Инструкция 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 

кто-нибудь есть решение для этого?

ответ

3

IIRC, JSR - Подпрограмма прыжка, а RTS - Возврат из подпрограммы. Таким образом, они являются безусловными вызовами функций и возврата функций, и все равно, какие флаги установлены. This tutorial shows how they work (and maybe has more parts that say something about conditional branches). Это был первый хит google для m68k rts, поэтому такого рода вещи найти не так уж сложно.

Ни одна из инструкций в вашем коде не является условной, поэтому такая же последовательность инструкций будет выполняться независимо от входящих данных.


это, кажется, просто полностью игнорируя инструкции в 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: 

 Смежные вопросы

  • Нет связанных вопросов^_^