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 返回到主计算器。警告:调用会干扰堆栈。
这些跳转可以与在后面部分中学到的代码结合使用。