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, R5
、JL
检查 R5 是否小于零(事实并非如此)。
为保证循环后R5为0,当R5不为0时跳转,即JNE
。 (并且 CMP #0, x
与 TST 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)。
给定 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, R5
、JL
检查 R5 是否小于零(事实并非如此)。
为保证循环后R5为0,当R5不为0时跳转,即JNE
。 (并且 CMP #0, x
与 TST 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)。