我更喜欢用十六进制编码我的计算器。我知道我的操作码和什么不是,但我不知道如何在寄存器HL中创建字符串“hello”。你帮忙吗?我用Google搜索了它,但很难找到答案,因为大多数人都使用编译器来处理它们。我想以艰难而富有挑战性的方式做到这一点。但我希望以十六进制的方式做到最有效。
我试过......
[此处代码] C9 - 返回 [STRING HERE]
...但似乎LD没有办法获取相关数据。所以我甚至无法在C9之后获得地址位置。有什么提示吗?
答案 0 :(得分:1)
this有帮助吗?
<强>字符串强>
字符串只是连续排列的很多字符。 但是,识别字符串的开头/结尾很重要。 所以,这就是它的完成方式:
Null-Terminating Strings具有空术语的字符串,或者在结尾处为0。
.DB "String Data",0
预定长度字符串第一个字节为的字符串 字符串的长度。
.DB 11,"String Data"
当您使用字符串进行操作时,this also looks useful表示空终止字符串。
答案 1 :(得分:0)
您不能在HL
的2字节寄存器中存储5个ASCII字符(“hello”)。您唯一能做的就是将这5个字符存储在内存中的某处,并使用此字符串的地址加载HL
(实际上,第一个字符的地址为“h”)。
修改强>:
如果你需要在子程序执行时找到它的位置,你可以从堆栈中读取返回地址,然后在返回地址之前最小程度地反汇编指令。
如果它是CALL (cc,) nn
或JP (cc,) nn
,子程序的地址将在指令的最后两个字节中进行编码。
如果是JP (HL/IX/IY)
,则地址位于用于间接跳转的寄存器(HL
,IX
或IY
)中。为了能够恢复此地址,您必须在子例程中保存这些寄存器的值(例如使用PUSH
)。
如果它是RET (cc)
,那么当你的子程序启动时,地址就在堆栈中,但它可能已被你的例程或中断服务程序的活动覆盖了。这是一个棘手的案例,但我希望它不是RET
。
您不能同时盲目可靠地反汇编指令,因为不同的指令具有不同的长度,而您可能认为JP (HL)
的内容实际上只是较长CALL nn
的一部分。但是调用子例程的代码不太可能改变,并且可能只有一个地方或一个调用方法,这意味着一旦你知道用于调用你的子程序的指令,你就不需要再猜测了,只是写下你的代码,假设它始终是那条指令。
使用上述技巧,您可以使用问题中建议的布局:
[code here] C9 - RETURN [STRING HERE]
您只需要恢复子程序的地址并将子程序的大小添加到其中。那将是字符串的地址。
答案 2 :(得分:0)
TI-83 + / 84 +我猜?程序从固定地址开始,$ 9D95,因此您可以手动将偏移量添加到该地址并使用绝对地址。