MSP430中的JL指令

JL instruction in MSP430

给定 MSP430 中的代码:

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

我被告知执行后 R5 的值是 4 而不是 0。

这是 JL 指令的特定内容吗?

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,不会小于0,所以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

请参阅手册中的示例:

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

在所有two-operand MSP 指令中,第一个操作数是源,第二个是目标。此约定对于所有其他指令更具可读性,但对于 CMP,这意味着将第二个操作数与第一个进行比较。

因此 CMP #0, R5JL 检查 R5 是否小于零(事实并非如此)。

为保证循环后R5为0,当R5不为0时跳转,即JNE。 (并且 CMP #0, xTST x 相同。)

这是我认为其他答案中遗漏的重点。正如克利福德指出的那样,如果 V xor N 为 1

,则 JL 表示跳跃

0x0005 - 0x0000

减法是用加法、倒数和加一来完成的

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

N为0,V为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 标志则跳转),这也没有任何大于或小于你必须了解的体系结构的问题从文档中看,如果大于小于助记符,则用于无符号数学或有符号数学,因为它有所不同。例如,如果您查看 arm,您会看到它从已签名中调出未签名(同一指令有两个 mnemonics/names)。