[英]JL instruction in 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
因此,僅當設置了負標志或溢出標志(但不能同時設置兩個標志)時,才會發生跳轉。
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
請參見手冊中的以下示例:
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
相同。)
這是我認為其他答案缺少的重點。 正如克利福德指出,如果V xor N為1,則JL表示跳躍
0x0005-0x0000
減法是通過加法,求反和加法完成的
11111111111111111
0000000000000101
+1111111111111111
===================
0000000000000101
N是0,V是0
N xor V為0 xor 0為0
JL不應分支。
N為0,V為0,Z為0,並且進位取決於體系結構,可以將其保持為C = 1,也可以將其求反,因為這是減法並認為是借位C = 0
從注釋中聽起來,您希望它退出R5 = 0的循環,所以我們知道R5大於0的標志是什么(我們可以假設)
0x0000-0x0000
11111111111111111
0000000000000000
+ 1111111111111111
====================
0000000000000000
V是0,N是0,Z現在是1,C是0或1,具體取決於架構
最容易使用的一個是如果不為零則跳轉(如果未設置z標志則為跳轉),這也不會有大於或小於您對於體系結構和文檔了解的問題對於無符號數學或有符號數學,大於助記符小於助記符會有所不同。 例如,如果您看一下arm,您會看到它從已簽名的代碼中調用了未簽名的符號(同一指令的兩個助記符/名稱)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.