Инструкция JL в MSP430

Учитывая код в MSP430:

     CLR  R6
     MOV  #5, R5                                  
L1:  DEC  R5
     CMP  #0, R5
     JL   L1
     INC  R6

Мне сказали, что значение R5 после выполнения равно 4, а не 0.

Это что-то конкретное для инструкции JL?


person user629034    schedule 07.03.2018    source источник
comment
Как инструкция CMP устанавливает биты состояния? Какие действия предпринимает JL для этих битов? Вы читали запись JL в руководстве? Что именно вам не понятно?   -  person CL.    schedule 07.03.2018
comment
Я не понимаю, почему JL выходит из строя после первого декремента. Насколько я понимаю, после первого декремента это будет продолжаться до тех пор, пока R5 не станет 0. Но мне сказали, что он не переходит на L1 после первого декремента.   -  person user629034    schedule 07.03.2018


Ответы (3)


JL означает "Перейти, если меньше".

Из набора инструкций:

JL : Jump to Label if (N .XOR. V) = 1 

Таким образом, переход происходит только в том случае, если установлен либо отрицательный флаг, либо флаг переполнения (но не оба).

Инструкция CMP может установить любой из них в результате выполнения b - a (в данном случае R5 - 0) — CMP #0, R5 — это просто способ проверки значения R5.

CMP и JL вместе означают IF R5 < 0 GOTO L1.

Поскольку вы установили его равным 5 и уменьшили до 4, оно не будет меньше нуля, поэтому JL не разветвляется.

Возможно, имелось в виду JNZ ("Перейти, если не равно нулю") или его синоним JNE ("Перейти, если не равно").

     CLR  R6      ; R6 = 0
     MOV  #5, R5  ; R5 = 5                        
L1:  DEC  R5      ; R5 = R5 - 1

     CMP  #0, R5  ; if R5 - 0 ...
     JL   L1      ; ... is less than zero ... <-- This is never true
                  ; ... then goto L1 

     INC  R6      ; R6 = R6 + 1
                  ; Here R5 = 4, R6 = 1

Обратите также внимание на то, что инструкция DEC также устанавливает флаги N и V, так что CMP на самом деле не нужен.

     CLR  R6      ; R6 = 0
     MOV  #5, R5  ; R5 = 5                        
L1:  DEC  R5      ; R5 = R5 - 1

     JNZ  L1      ; if R5 is not zero ... 
                  ; ... then goto L1   <-- This will loop until R5 == zero

     INC  R6      ; R6 = R6 + 1
                  ; Here R5 = 0, R6 = 1
person Clifford    schedule 07.03.2018

См. этот пример из руководства:

CMP  @R7,R6   ; Is R6 < @R7?
JL   Label5   ; Yes, go to Label5
...           ; No, continue here

Во всех инструкциях MSP с двумя операндами первый операнд является источником, а второй — приемником. Это соглашение более удобочитаемо для всех остальных инструкций, но для CMP оно означает, что второй операнд сравнивается с первым.

Итак, CMP #0, R5, JL проверяют, меньше ли R5 нуля (что не так).

Чтобы убедиться, что R5 равно нулю после цикла, выполните переход, когда R5 не равен нулю, т. е. JNE. (И CMP #0, x совпадает с TST x.)

person CL.    schedule 07.03.2018

Это я считаю важным моментом, отсутствующим в других ответах. Как указывает Клиффорд, JL означает прыжок, если V xor N равно 1.

0x0005 - 0x0000

вычитание производится сложением, инвертированием и добавлением единицы

11111111111111111
 0000000000000101
+1111111111111111
===================
 0000000000000101

N is 0, V is 0

N xor V равно 0 xor 0, что равно 0

JL не должен разветвляться.

N равно 0, V равно 0, Z равно 0, и выполнение зависит от архитектуры, оно может сохранить его как есть C = 1 или может инвертировать его, потому что это вычитание и считать его заимствованием C = 0

Из комментария кажется, что вы хотите, чтобы это выходило из цикла с R5 = 0, чтобы мы знали, какие флаги будут для R5 больше 0 (ну, мы можем предположить)

0x0000 - 0x0000

   11111111111111111
    0000000000000000
 +  1111111111111111
====================
    0000000000000000

V равно 0, N равно 0, Z теперь равно 1, а C равно 0 или 1 в зависимости от архитектуры.

Проще всего использовать переход, если не ноль (переход, если флаг z не установлен), это также не имеет проблем, которые больше или меньше, чем есть, как вы должны понимать для архитектуры и из документации, если больше, чем меньше, чем мнемоники для математики без знака или математики со знаком, поскольку это имеет значение. если вы посмотрите, например, на руку, вы увидите, что она вызывает неподписанное из подписанного (две мнемоники/имена для одной и той же инструкции).

person old_timer    schedule 07.03.2018
comment
при программировании на ассемблере документация не всегда дает понять, каким образом происходит вычитание, и они не всегда документируют проверяемые флаги, и, конечно же, просто слепо выбирают прыжок, если больше, прыжок, если меньше и т. д., вероятность того, что это меньше чем вы думали, довольно низкие 25%. подписанный против беззнакового a - b или b - a только одна из комбинаций - это то, что вы хотели, остальные 75% - это комбинации, которые не будут работать для вас. так что проведите свое исследование и остановитесь и проведите индивидуальный эксперимент, если вы чувствуете, что вам нужно использовать эти мнемоники (меньше или больше, чем варианты). - person old_timer; 07.03.2018