Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MSP430中的JL指令_Assembly_Embedded_Cpu Architecture_Msp430 - Fatal编程技术网

Assembly MSP430中的JL指令

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 因此,只有在设置了负或溢出标志(但不是两者)时才会发生跳

给定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值的一种方法,来设置这两种指令之一

如果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