给定MSP430中的代码:
CLR R6
MOV #5, R5
L1: DEC R5
CMP #0, R5
JL L1
INC R6我被告知执行后R5的值是4,而不是0。
这是JL指令的特定内容吗?
发布于 2018-03-07 18:59:06
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发布于 2018-03-07 19:16:38
请参阅手册中的示例:
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相同。)
发布于 2018-03-07 20:34:52
这是我认为在其他答案中遗漏的重要一点。正如Clifford所指出的,如果V是1,JL就意味着跳跃。
0x0005-0x0000
减法是通过加法、倒置和加法完成的。
11111111111111111
0000000000000101
+1111111111111111
===================
0000000000000101N是0,V是0
N是0或0,等于0。
JL不应该分支。
N是0,V是0,Z是0,执行取决于体系结构,它可以保持C=1,也可以反转它,因为这是一个减法,并认为它是借用C=0。
从注释中可以看出,您希望使用R5 =0退出循环,因此我们知道R5大于0的标志将是什么(我们可以假设)
0x0000 - 0x0000
11111111111111111
0000000000000000
+ 1111111111111111
====================
0000000000000000V是0,N是0,Z现在是1,C是0或1,这取决于体系结构
最容易使用的方法是跳转,如果不是零(如果没有设置z标志,则跳),这也没有任何大于或小于您必须理解的体系结构和文档(如果小于助记符的话)的问题,因为它有区别。例如,如果您查看arm,您将看到它从签名中调用未签名的内容(相同指令的两个助记符/名称)。
https://stackoverflow.com/questions/49158028
复制相似问题