首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSP430中的JL指令

MSP430中的JL指令
EN

Stack Overflow用户
提问于 2018-03-07 17:34:52
回答 3查看 1.1K关注 0票数 1

给定MSP430中的代码:

代码语言:javascript
复制
     CLR  R6
     MOV  #5, R5                                  
L1:  DEC  R5
     CMP  #0, R5
     JL   L1
     INC  R6

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-07 18:59:06

JL是“跳跃如果小于”。

从指令集:

代码语言:javascript
复制
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 (“跳跃(如果不等于)”)。

代码语言:javascript
复制
     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实际上是不必要的。

代码语言:javascript
复制
     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
票数 3
EN

Stack Overflow用户

发布于 2018-03-07 19:16:38

请参阅手册中的示例:

代码语言:javascript
复制
CMP  @R7,R6   ; Is R6 < @R7?
JL   Label5   ; Yes, go to Label5
...           ; No, continue here

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

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

为了确保循环后的R5为零,当R5不等于零时跳,即JNE。( CMP #0, xTST x相同。)

票数 0
EN

Stack Overflow用户

发布于 2018-03-07 20:34:52

这是我认为在其他答案中遗漏的重要一点。正如Clifford所指出的,如果V是1,JL就意味着跳跃。

0x0005-0x0000

减法是通过加法、倒置和加法完成的。

代码语言:javascript
复制
11111111111111111
 0000000000000101
+1111111111111111
===================
 0000000000000101

N是0,V是0

N是0或0,等于0。

JL不应该分支。

N是0,V是0,Z是0,执行取决于体系结构,它可以保持C=1,也可以反转它,因为这是一个减法,并认为它是借用C=0。

从注释中可以看出,您希望使用R5 =0退出循环,因此我们知道R5大于0的标志将是什么(我们可以假设)

0x0000 - 0x0000

代码语言:javascript
复制
   11111111111111111
    0000000000000000
 +  1111111111111111
====================
    0000000000000000

V是0,N是0,Z现在是1,C是0或1,这取决于体系结构

最容易使用的方法是跳转,如果不是零(如果没有设置z标志,则跳),这也没有任何大于或小于您必须理解的体系结构和文档(如果小于助记符的话)的问题,因为它有区别。例如,如果您查看arm,您将看到它从签名中调用未签名的内容(相同指令的两个助记符/名称)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49158028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档