Assembly MSP430中的JL指令
给定MSP430中的代码:Assembly MSP430中的JL指令,assembly,embedded,cpu-architecture,msp430,Assembly,Embedded,Cpu Architecture,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 因此,只有在设置了负或溢出标志(但不是两者)时才会发生跳
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值的一种方法,来设置这两种指令之一
如果R5<0转到L1,则CMP和JL一起表示
由于您已将其设置为5,并将其递减为4,因此它将不小于零,因此JL不会分支
也许JNZ的用意是(“非零跳转”),或者它的同义词JNE(“非相等跳转”)
CLR-R6;R6=0
MOV#5,R5;R5=5
L1:DEC R5;R5=R5-1
CMP#0,R5;如果R5-0。。。
JL-L1。。。小于零 请参阅手册中的此示例:
CMP @R7,R6 ; Is R6 < @R7?
JL Label5 ; Yes, go to Label5
... ; No, continue here
CMP@R7、R6;R6是否小于R7?
JL-Label5;是的,去Label5
... ; 不,继续这里
在所有两个操作数MSP指令中,第一个操作数是源,第二个操作数是目标。此约定对于所有其他指令更具可读性,但对于CMP,它意味着将第二个操作数与第一个操作数进行比较
因此,CMP#0,R5
,JL
检查R5是否小于零(情况并非如此)
为确保循环后R5为零,请在R5不等于零时跳转,即JNE
。(和<代码> CMP>0,x与<代码> TST X)相同, < P>这是我认为其他答案缺少的重要点。正如Clifford指出的,如果V xor N为1,JL意味着跳跃
0x0005-0x0000
减法是通过加法、逆变和加一来完成的
11111111111111111
0000000000000101
+1111111111111111
===================
0000000000000101
N是0,V是0
nxor V是0,xor是0
JL不应分支
<p>n为0,v为0,z为0,执行取决于体系结构,它可以保持为c=1,或者它可以颠倒,因为这是一个减法,并且认为它是一个借入c=0</p>
从注释来看,您似乎希望它以R5=0退出循环,这样我们就知道R5的标志将大于0(我们可以假设)
0x0000-0x0000
11111111111111111
0000000000000000
+ 1111111111111111
====================
0000000000000000
V是0,N是0,Z现在是1,C是0或1,这取决于体系结构
最容易使用的方法是非零跳转(如果未设置z标志,则跳转),这也没有任何大于或小于的问题,这是您必须了解的架构,并且从文档中可以看出,如果大于或小于助记符用于无符号数学或有符号数学,因为它会产生差异。例如,如果您查看arm,您将看到它从有符号(同一条指令的两个助记符/名称)中调用无符号。CMP指令如何设置状态位?JL对这些BIT采取什么行动?您是否阅读了手册中的JL条目?你到底不明白什么?我不明白为什么JL在第一次减量后失败。我的理解是,在第一次减量之后,它将持续到R5为0。但是我被告知在第一次减量后不会跳转到L1。在汇编中编程时,文档并不总是明确减法的方式,也不总是记录正在测试的标志,当然只是盲目地选择大于跳转,小于跳转,等等,比你想象的要少的几率很低,只有25%。有符号与无符号的a-b或b-a只有一种组合是你想要的,另外75%的组合对你不起作用。所以,做你的研究,如果你觉得需要使用这些记忆法(小于或大于变化),停下来做一个定制的实验。
11111111111111111
0000000000000101
+1111111111111111
===================
0000000000000101
11111111111111111
0000000000000000
+ 1111111111111111
====================
0000000000000000