Z80 Asm - Hex如何创建字符串

时间:2012-01-29 07:32:27

标签: assembly cpu processor z80

我更喜欢用十六进制编码我的计算器。我知道我的操作码和什么不是,但我不知道如何在寄存器HL中创建字符串“hello”。你帮忙吗?我用Google搜索了它,但很难找到答案,因为大多数人都使用编译器来处理它们。我想以艰难而富有挑战性的方式做到这一点。但我希望以十六进制的方式做到最有效。

我试过......

[此处代码] C9 - 返回 [STRING HERE]

...但似乎LD没有办法获取相关数据。所以我甚至无法在C9之后获得地址位置。有什么提示吗?

3 个答案:

答案 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,) nnJP (cc,) nn,子程序的地址将在指令的最后两个字节中进行编码。

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

如果它是RET (cc),那么当你的子程序启动时,地址就在堆栈中,但它可能已被你的例程或中断服务程序的活动覆盖了。这是一个棘手的案例,但我希望它不是RET

您不能同时盲目可靠地反汇编指令,因为不同的指令具有不同的长度,而您可能认为JP (HL)的内容实际上只是较长CALL nn的一部分。但是调用子例程的代码不太可能改变,并且可能只有一个地方或一个调用方法,这意味着一旦你知道用于调用你的子程序的指令,你就不需要再猜测了,只是写下你的代码,假设它始终是那条指令。

使用上述技巧,您可以使用问题中建议的布局:

[code here] C9 - RETURN [STRING HERE]

您只需要恢复子程序的地址并将子程序的大小添加到其中。那将是字符串的地址。

答案 2 :(得分:0)

TI-83 + / 84 +我猜?程序从固定地址开始,$ 9D95,因此您可以手动将偏移量添加到该地址并使用绝对地址。