【发布时间】:2019-05-10 02:45:32
【问题描述】:
我目前正在使用 Z80 处理器仿真器,作为初学者,我发现了一个为内存分配值以显示“Hello World!”的示例。
1. 0x21, 0x0C, 0X00,// ld hl, 0008
2. 0x06, 0x0F, // ld b,0f
3. 0x7e, // ld a,(hl)
4. 0x23, // inc hl
5. 0xD3, 0x00, // out (00), a
6. 0x10, 0xFA, // djnz
7. 0x76, // halt
8. 0x48, 0x65, 0x6C, 0x6C, 0x6F, // Hello
9. 0x2D, 0x77, 0x6F, 0x72, 0x6C, // Worl
10. 0x64, 0x21, 0x20, 0x21//d! !
我对内存中的值有一些疑问:
在第一行,对于命令
0x21定义了LD HL,XX指令,所以它在汇编程序中是LD HL,0CH,那0x00在那里做什么?我认为LD HL,xx是一个 16 位指令,所以用八个零来补充0C,但我认为这是不正确的。在第 5 行,
OUT (00),A到底在做什么?我通过一些研究发现OUT将数据从累加器传输到输出端口,但我不太清楚0x00的具体用途。
非常感谢您对我的问题的任何提示或帮助,提前感谢您抽出时间阅读它们。
【问题讨论】:
-
LD HL, XX将 16 位值加载到HL中。指定一个 16 位值需要两个字节。在第 5 行,00是端口号。听起来您需要先学习 Z80 汇编语言,然后才能开始编写模拟器。 -
并且代码被错误地复制和粘贴。它是
Hello-world! !,只有 14 个字节长,而 DJNZ 被初始化为循环 15 次。 :) 显然,HL 加载的是地址 0x000C 而不是评论所声称的 0x0008。 -
@tum_ 现在我对
DJNZ范围感到困惑,15是在哪里给出的?当我检查表格时,0xFA是JP M,XX的操作码。提前感谢您的关注。 -
10 n DJNZ PC + n- 所以 10(hex) 是操作码,FA (== -6) 是要跳转到的偏移量。 DJNZ 递减寄存器 B,将其与 0 比较,如果非零 - 跳转,否则 - 失败。 B 设置为 0F,即 15。
标签: z80