我更喜欢在我的计算器上以十六进制编码。我知道我的操作码和什么不是,但我不知道如何在寄存器HL中创建一个字符串“hello”。你有帮助吗?我搜索了它,但很难找到答案,因为大多数人使用编译器来处理它们。尽管如此,我想尽力做到这一点。但我希望以十六进制的方式实现最有效的方式。Z80 Asm - Hex如何创建字符串
我想....
[这里代码] C9 - 返回 [STRING HERE]
...但它似乎并不LD有一种方式来获得相关数据。所以我甚至无法获得C9之后的地址位置。有小费吗?
我更喜欢在我的计算器上以十六进制编码。我知道我的操作码和什么不是,但我不知道如何在寄存器HL中创建一个字符串“hello”。你有帮助吗?我搜索了它,但很难找到答案,因为大多数人使用编译器来处理它们。尽管如此,我想尽力做到这一点。但我希望以十六进制的方式实现最有效的方式。Z80 Asm - Hex如何创建字符串
我想....
[这里代码] C9 - 返回 [STRING HERE]
...但它似乎并不LD有一种方式来获得相关数据。所以我甚至无法获得C9之后的地址位置。有小费吗?
不能在2字节寄存器中存储5个ASCII字符(“hello”),其中HL
是。你唯一能做的就是将这5个字符存储在内存中的某个地方,并用该字符串的地址(实际上是它的第一个字符“h”的地址)加载HL
。
编辑:
如果你需要,而它的执行找到子程序的位置,就可以从堆栈读取返回地址,然后就返回地址之前微创拆卸指令。
如果是CALL (cc,) nn
或JP (cc,) nn
,子程序的地址被编码在指令的最后两个字节中。
如果是JP (HL/IX/IY)
,地址是在用于间接跳转的寄存器(HL
,IX
或IY
)。为了能够恢复这个地址,你必须在你的子程序中保存这些寄存器的值(例如使用PUSH
)。
如果是RET (cc)
,当你的子程序启动时,地址就在堆栈中,但它可能因为你的例程或中断服务例程的活动而被覆盖。这是一个艰难的情况,但我希望它不是RET
。
由于不同的指令具有不同的长度以及您认为的JP (HL)
实际上可能只是较长的CALL nn
的一部分,因此您不能同时盲目和可靠地拆解说明。但调用你的子程序的代码不太可能改变,并且很可能只有一个地方或一个调用方法,这意味着一旦你知道调用你的子程序的指令,你就不需要猜测任何东西了,只需要编写你的代码,假设它总是那条指令。
使用上述技术,你可以用你的问题建议的布局:
[代码这里] C9 - RETURN [STRING HERE]
你只需要恢复的子程序的地址,并添加到它是子程序的大小。这将是字符串的地址。
我知道我不能将它们存储到HL中。但是,我将如何将它们存储到内存中?我不知道哪些内存地址可以自由写入。我知道我必须用00 – 2012-01-29 07:42:41
来终止字符串,但是你以某种方式为你的代码找到了一个地方? – 2012-01-29 08:45:04
请参阅答案的更新。 – 2012-01-29 09:14:05
请问this有帮助吗?
字符串
字符串只是大量连续的顺序放在一起的字符。 但是,识别字符串的开始/结尾很重要。 所以,以下是它的完成方式:
空终止字符串空字符或末尾为0的字符串。
.DB "String Data",0
预确定的长度字符串字符串,其中第一个字节是 长度的字符串。
.DB 11,"String Data"
当你正在用绳子做的事情,this also looks useful为空终止字符串。
这没有帮助。我不想在一个asm编译器中这样做。我已经知道如何做到这一点。我在计算器上直接用十六进制来做这个。这就是为什么我需要知道如何正确地做到这一点。 – 2012-01-29 07:44:37
oh crikey,我没有正确阅读q,祝你好运! – IanNorton 2012-01-29 08:02:30
TI-83 +/84 +我猜?程序从一个固定的地址开始,$ 9D95,所以你可以手动添加偏移量并使用绝对地址。
通常做这种事情的方法是编译一些代码,然后看看编译器做了什么。 (应该有一种方法可以让编译器转储出生成的汇编代码。) – 2012-01-29 07:50:24
我会,但是编译器都是垃圾,并且从来没有正常工作。 – 2012-01-29 08:17:29