跳转到内容

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 返回到主计算器。警告:调用会干扰堆栈。

这些跳转可以与在后面部分中学到的代码结合使用。


前一个:Hello World
下一个:寄存器
目录:TI 83 Plus 汇编

华夏公益教科书