5

每次我为 TI-83+ 计算器(Z80 处理器)组装应用程序时,它都会在 CALL 处停止运行。这是一个示例(“Hello”)——它开始运行得很好,但计算器在 CALL 指令处冻结。我在 CALL 之前放置的任何东西都可以正常工作,而我在 CALL 之后放置的任何东西都不会运行。这是代码的反汇编,以显示地址而不是标签。我已经“修改”以显示那些落入的数据库行,以使其更易于阅读。

我在编写程序集“程序”(加载到 RAM 中)时从来没有遇到过这个问题。我所知道的运行“应用程序”(保存在 Flash ROM 中)的唯一问题是它们不能自我修改,而且因为分页是必要的,所以不可能在单独的页面上访问数据。这不是自我修改,只有一页......我做错了什么?

0080 218900        LD   HL, 0089h
0083 cd9900        CALL 0099h        ;                      --- App stops here
0086 c38f00        JP   008fh
0089 48656c6c6f00  DB   "Hello", 0
008f fd360500      LD   (IY+05h), 0
0093 ef            RST  28h          ; B_CALL (
0094 364c          DB   4C36h        ;   _ReloadAppEntryVecs)
0096 ef            RST  28h          ; B_CALL (
0097 2740          DB   4027h        ;   _JForceCmdNoChar)  --- App should end here
0099 7e            LD   A, (HL)      ;                      --- Call goes to here
009a ef            RST  28h          ; B_CALL (
009b 0445          DB   4504h        ;   _PutC)
009d fe00          CP   0
009f c8            RET  Z
00a0 23            INC  HL
00a1 18f6          JR   0099h
4

2 回答 2

9

显然,您正在组装到地址 0080h。这不可能是正确的,因为地址范围 0000h--3FFFh 被锁定到 ROM 页 0。事实上,根据这个例子,你汇编到 4000h。所以你的问题是你的 CALL 正在跳转到固件,而不是你的应用程序的一部分。

于 2010-01-27T21:57:35.657 回答
2

这是我为 Ti-83+ 找到的内存映射。你不能在地址 $0080 加载这个程序,那是 ROM 所在的地方。它被加载到其他地方。这会持续一段时间,直到您发出 JP 或 CALL。CALL $0099 不会跳转到您预期的跳转地址,它会跳转到 ROM。这是一个快速结束。

您需要在 .asm 中选择适当的 ORG 指令,以便将其加载到 RAM 中的预期地址。无论那可能在哪里。

于 2010-01-27T22:09:00.540 回答