MSP430中的JL指令

时间:2018-03-07 17:34:53

标签: assembly embedded cpu-architecture msp430

鉴于MSP430中的代码:

import Data.List.Index 
> indexed [i*i | i <- [7,6,5]]
[(0,49),(1,36),(2,25)]

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

这是JL指令特有的吗?

3 个答案:

答案 0 :(得分:2)

JL&#34; 如果小于&#34>则跳转。

从指令集:

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是有意的(&#34; 跳跃,如果不是零&#34;),或其同义词JNE(&#34; 跳跃,如果不相等& #34;。)

     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

答案 1 :(得分:0)

请参阅手册中的此示例:

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相同。)

答案 2 :(得分:0)

这是我认为其他答案中缺少的重点。正如Clifford所指出的,如果V x或N为1,则JL意味着跳跃

0x0005 - 0x0000

通过加法,反转并添加一个

来完成减法
<?php
    require_once 'dbconfig.php';
    $query = "SELECT musicID, musicName, musicUploader, musicDate FROM tbl_music WHERE musicID = ?";
    $stmt = $DBcon->prepare( $query );
    $stmt->execute([(int)$_GET['music']]);
    $details=$stmt->fetch(PDO::FETCH_ASSOC);
?>

N为0,V为0

N x或V是0 x或0,其为0

JL不应该分支。

N为0,V为0,Z为0且进位取决于它可以保持的架构,因为C = 1或者可以将其反转,因为这是减法并认为它是借用C = 0 < / p>

从评论中听起来你希望它以R5 = 0退出循环,所以我们知道R5的标志大于0(我们可以假设)

0x0000 - 0x0000

11111111111111111
 0000000000000101
+1111111111111111
===================
 0000000000000101

V为0,N为0,Z现为1,C为0或1,具体取决于架构

最容易使用的是如果不是零则跳转(如果没有设置z标志则跳转),这也没有任何大于或小于你必须了解的架构和问题的问题如果大于小于助记符的文档用于无符号数学或带符号数学,则文档会有所不同。例如,如果你看看arm,你会看到它从signed中调用unsigned(同一指令的两个助记符/名字)。