TI 83 Plus 彙編/跳轉
在之前的程式中,寫了一個標籤
text:
.db "Hello, World",0
text: 是一個標籤。標籤永遠不會被縮排,並且總是以冒號結尾。標籤實際上是 16 位數字,指向緊隨其後的指令。因此,標籤實際上是 16 位立即數,可以以相同的方式處理(相同的載入適用於它們)。它們標記程式中的一個位置。可以使用 jp labelname 跳轉到一個標籤。
.NOLIST
#define END .end
#define end .end
#define equ .equ
#include "ti83plus.inc"
.LIST
.org 9D93h
.db $BB,$6D
jp clearscreen ;here it is
ld a,0
ld (CURCOL),a
ld (CURROW),a
ld hl,text
B_CALL(_PutS)
ret
text:
.db "Text",0
clearscreen: ;and here it goes
B_CALL(_ClrLCDFull)
.end
end
(B_CALL(_ClrLCDFull) 清理螢幕。) 上面的程式清除了螢幕,但從未顯示文字。為什麼?因為 jp clearscreen 會自動跳轉到標籤 clearscreen,並一直執行到程式結束,跳過所有文字顯示程式碼。
jp label 等於此無效語法程式碼 LD PC,label。
順便說一句,以分號結尾的內容是註釋:它們用於解釋程式碼,並且編譯器會忽略它們。(編譯器是將您編寫的程式碼轉換為機器可以讀取的程式碼的程式。)
jr 是一個類似於 jp 的跳轉指令,但有一些重要的區別。它小一個位元組(這可能看起來不算多,但它可以累加起來);然而,與 jp(可以跳轉到任何地址)不同,jr 只能跳轉到程式碼中最多向前 127 位元組或最多向後 128 位元組的標籤。因此,如果標籤很遠,請使用 jp,否則使用 jr。事實上,您可能希望始終使用 jr,因為當您編譯時,如果標籤距離過遠,就會返回錯誤。編譯器將 jr 後面標籤指向的地址從標籤本身的地址中減去,如果結果不適合帶符號的 8 位數字,它將丟擲錯誤,因為它無法編譯(地址超出範圍)。JR 始終比 JP 慢,並且您無法在其中使用所有條件。JR 可以使用條件 Z、NZ、C 和 NC,而 JP、RET 和 CALL 可以使用條件 Z、NZ、C、NC、PO(奇校驗)、PE(偶校驗)、P(正數)和 M(負數)。
上面程式中的跳轉可以用 jr 替換
.NOLIST
#define END .end
#define end .end
#define equ .equ
#include "ti83plus.inc"
.LIST
.org 9D93h
.db $BB,$6D
jr clearscreen ;this saves space!
假設您要跳轉到某個地方然後返回。CALL 將其地址 +3 推入堆疊;RET 從 PC 中彈出堆疊的頂部。這與 PUSH-POP 堆疊完全相同,因此請小心。使用 call 和 ret 到某處“跳轉”並返回
.NOLIST
#define END .end
#define end .end
#define equ .equ
#include "ti83plus.inc"
.LIST
.org 9D93h
.db $BB,$6D
call clearscreen ;1. here it is
ld a,0 ;4. to here
ld (CURCOL),a
ld a,0
ld (CURROW),a
ld hl,text
B_CALL(_PutS)
ret ;5. and ends
text:
.db "Text",0
clearscreen: ;2. here it goes
B_CALL(_ClrLCDFull)
ret ;3. then it comes back
.end
end
如您所見,第一個 ret(緊接在 _ClrLCDFull 之後)返回到 call 命令之後。然後,第二個 ret 結束了程式。您可以將您的程式視為一個大型呼叫例程,其中結束的 ret 返回到主計算器。警告:呼叫會干擾堆疊。
這些跳轉可以與在後面部分中學到的程式碼結合使用。