【发布时间】:2020-08-08 22:12:24
【问题描述】:
在尝试为我的 TI-84 PlusCE 编写程序集的过程中,我遇到了一个奇怪的“错误”。考虑以下代码:
#include "includes\ti84pce.inc"
s_mem_start = saveSScreen
.assume ADL=1
.org userMem-2
.db tExtTok,tAsm84CeCmp
;relevant portion
ld HL, s_mem_start
ld DE, 2
ADD HL, DE
ld D, H
ld E, L
ld A, (HL)
call _PutC
ld A, (DE)
call _PutC
;/relevant portion
ret
saveSScreen 是空闲内存的一部分。 _PutC 是一个 rom 调用,将 A 的值打印到屏幕上。请参阅此图表:http://tibasicdev.wikidot.com/83lgfont。我已经确认_PutC 不会影响任何寄存器。这段代码在屏幕上的输出是v[CursorInsertSecond]。 (CursorInsertSecond 是计算器上的一个字符)。这些等效于十六进制 03 或 73 和 E5。我不知道 v 是普通 v 还是斜体 v。
显然(HL) 和(DE) 正在访问内存的不同部分。使用BC 时也是如此。奇怪的是,我在任何地方都找不到记录的这些信息。只有一个寄存器对来访问内存似乎是一个主要的不利因素。确实让我自己的代码感觉很臃肿。
我注意到的最后一件奇怪的事情是,这似乎只适用于添加到HL 时。考虑这段代码:(减去标题部分)。
ld HL, s_mem_start + 2
ld DE, s_mem_start + 2
ld A, (HL)
call _PutC
ld A, (DE)
call _PutC
这将导致输出 vv。这里会发生什么?为什么(HL) 和(DE) 会给出不同的输出,但只是在某些时候。
- 运行第一个程序后我的计算器屏幕:https://imgur.com/a/C6zGCz2
- 我的 ti84pce.inc 文件:https://wikiti.brandonw.net/index.php?title=84PCE:OS:Include_File
- 计算器型号:TI-84 Plus CE
- 编译器:https://github.com/alberthdev/spasm-ng/releases
- 链接器:TI-Connect
【问题讨论】:
-
我的猜测是
_PutC破坏了您在s_mem_start+2的数据。也许它毕竟不是免费的 ram :) 如果您在第一个_PutC之前执行(DE)加载并推送值然后弹出它以进行第二次调用会发生什么?如果您先打印(DE),然后再打印(HL),会发生什么情况? -
@Jester 无论我做什么组合,每个结果都是一样的。 ram 用于存储屏幕的备份,因此我发现它极不可能被覆盖。这也无法解释为什么第二段代码的工作方式不同。
-
如图所示的第二个代码使用
s_mem_start而不是s_mem_start+2。那也许试试? -
@Jester 没有骰子。两个 vs 而不是 ns。我会编辑问题来解决这个问题。
标签: assembly texas-instruments z80