我更喜欢在我的计算器上用十六进制编码。我知道我的操作码和什么不知道,但我不确定如何在寄存器 HL 中创建字符串“hello”。你能帮忙吗?我已经用谷歌搜索了它,但很难找到答案,因为大多数人使用为他们处理这个问题的编译器。不过,我想以艰难而富有挑战性的方式做到这一点。但我想要最有效的十六进制方式。
我试过了....
[此处的代码] C9 - 返回 [此处的字符串]
...但似乎 LD 没有办法获取相关数据。所以我什至无法获得C9之后的地址位置。有小费吗?
TI-83+/84+ 我猜?程序从固定地址 $9D95 开始,因此您可以手动添加偏移量并使用绝对地址。
您不能在 2 字节寄存器中存储 5 个 ASCII 字符(“hello”),即HL
。您唯一能做的就是将这 5 个字符存储在内存中的某个位置并加载HL
该字符串的地址(实际上是其第一个字符“h”的地址)。
编辑:
如果您需要在子程序执行时找到子程序的位置,您可以从堆栈中读取返回地址,然后在返回地址之前对指令进行最小程度的反汇编。
如果是CALL (cc,) nn
或JP (cc,) nn
,则子例程的地址编码在指令的最后两个字节中。
如果是JP (HL/IX/IY)
,则地址在用于间接跳转的寄存器( 或 )HL
中IX
。IY
为了能够恢复此地址,您必须将这些寄存器的值保存在您的子程序中(使用 eg PUSH
)。
如果是RET (cc)
,则地址在您的子程序启动时位于堆栈上,但它可能已被您的例程的活动或中断服务例程的活动覆盖。这是一个棘手的案例,但我希望不是RET
。
您不能同时盲目且可靠地反汇编指令,因为不同的指令具有不同的长度,而您可能认为JP (HL)
的实际上可能只是较长的一部分CALL nn
。但是调用子程序的代码不太可能改变,而且很可能只有一个地方或一种调用方法,这意味着一旦你知道用于调用子程序的指令,你就不需要再猜测任何东西了,只需假设它始终是该指令,请编写您的代码。
使用上述技术,您可以使用问题中建议的布局:
[此处的代码] C9 - 返回 [此处的字符串]
您只需要恢复子程序的地址并将子程序的大小添加到它。那将是字符串的地址。