2012-01-29 66 views
1

我更喜欢在我的计算器上以十六进制编码。我知道我的操作码和什么不是,但我不知道如何在寄存器HL中创建一个字符串“hello”。你有帮助吗?我搜索了它,但很难找到答案,因为大多数人使用编译器来处理它们。尽管如此,我想尽力做到这一点。但我希望以十六进制的方式实现最有效的方式。Z80 Asm - Hex如何创建字符串

我想....

[这里代码] C9 - 返回 [STRING HERE]

...但它似乎并不LD有一种方式来获得相关数据。所以我甚至无法获得C9之后的地址位置。有小费吗?

+0

通常做这种事情的方法是编译一些代码,然后看看编译器做了什么。 (应该有一种方法可以让编译器转储出生成的汇编代码。) – 2012-01-29 07:50:24

+0

我会,但是编译器都是垃圾,并且从来没有正常工作。 – 2012-01-29 08:17:29

回答

0

不能在2字节寄存器中存储5个ASCII字符(“hello”),其中HL是。你唯一能做的就是将这5个字符存储在内存中的某个地方,并用该字符串的地址(实际上是它的第一个字符“h”的地址)加载HL

编辑

如果你需要,而它的执行找到子程序的位置,就可以从堆栈读取返回地址,然后就返回地址之前微创拆卸指令。

如果是CALL (cc,) nnJP (cc,) nn,子程序的地址被编码在指令的最后两个字节中。

如果是JP (HL/IX/IY),地址是在用于间接跳转的寄存器(HLIXIY)。为了能够恢复这个地址,你必须在你的子程序中保存这些寄存器的值(例如使用PUSH)。

如果是RET (cc),当你的子程序启动时,地址就在堆栈中,但它可能因为你的例程或中断服务例程的活动而被覆盖。这是一个艰难的情况,但我希望它不是RET

由于不同的指令具有不同的长度以及您认为的JP (HL)实际上可能只是较长的CALL nn的一部分,因此您不能同时盲目和可靠地拆解说明。但调用你的子程序的代码不太可能改变,并且很可能只有一个地方或一个调用方法,这意味着一旦你知道调用你的子程序的指令,你就不需要猜测任何东西了,只需要编写你的代码,假设它总是那条指令。

使用上述技术,你可以用你的问题建议的布局:

[代码这里] C9 - RETURN [STRING HERE]

你只需要恢复的子程序的地址,并添加到它是子程序的大小。这将是字符串的地址。

+0

我知道我不能将它们存储到HL中。但是,我将如何将它们存储到内存中?我不知道哪些内存地址可以自由写入。我知道我必须用00 – 2012-01-29 07:42:41

+0

来终止字符串,但是你以某种方式为你的代码找到了一个地方? – 2012-01-29 08:45:04

+0

请参阅答案的更新。 – 2012-01-29 09:14:05

1

请问this有帮助吗?

字符串

字符串只是大量连续的顺序放在一起的字符。 但是,识别字符串的开始/结尾很重要。 所以,以下是它的完成方式:

空终止字符串空字符或末尾为0的字符串。

.DB "String Data",0 

预确定的长度字符串字符串,其中第一个字节是 长度的字符串。

.DB 11,"String Data" 

当你正在用绳子做的事情,this also looks useful为空终止字符串。

+0

这没有帮助。我不想在一个asm编译器中这样做。我已经知道如何做到这一点。我在计算器上直接用十六进制来做这个。这就是为什么我需要知道如何正确地做到这一点。 – 2012-01-29 07:44:37

+0

oh crikey,我没有正确阅读q,祝你好运! – IanNorton 2012-01-29 08:02:30

0

TI-83 +/84 +我猜?程序从一个固定的地址开始,$ 9D95,所以你可以手动添加偏移量并使用绝对地址。