6

考虑这个示例代码:

ZilogZ80A cpu = new ZilogZ80A();
cpu.GeneralRegisters.H.FromUInt(229);
cpu.GeneralRegisters.L.FromUInt(90);
Console.WriteLine("H : " + cpu.GeneralRegisters.H.ToString());
Console.WriteLine("L : " + cpu.GeneralRegisters.L.ToString());
Console.WriteLine("HL: " + cpu.GeneralRegisters.HL.ToString());

Console.WriteLine("Load 23268 (0x5AE4) into register HL...");
cpu.GeneralRegisters.HL.FromUInt(23268);

Console.WriteLine("H : " + cpu.GeneralRegisters.H.ToString());
Console.WriteLine("L : " + cpu.GeneralRegisters.L.ToString());
Console.WriteLine("HL: " + cpu.GeneralRegisters.HL.ToString());

正在执行以下操作:

  • 将 229(十进制)加载到寄存器 H
  • 将 90(十进制)加载到寄存器 L
  • 打印出 H、L 和 HL 寄存器的值(十六进制、二进制 MSB、十进制)
  • 将 23268(十进制)加载到寄存器 HL
  • 再次打印出 H、L 和 HL 寄存器的值。

样本输出:

H : 08-bit length register (@45653674): 0x00E5 | MSB 0b11100101 | 229
L : 08-bit length register (@41149443): 0x005A | MSB 0b01011010 | 90
HL: 16-bit length register (@39785641): 0x5AE5 | MSB 0b01011010 11100101 | 23269
Load 23268 (0x5AE4 into register HL...
H : 08-bit length register (@45653674): 0x00E4 | MSB 0b11100100 | 228
L : 08-bit length register (@41149443): 0x005A | MSB 0b01011010 | 90
HL: 16-bit length register (@39785641): 0x5AE4 | MSB 0b01011010 11100100 | 23268

现在的问题:

  1. 上述关于寄存器功能的假设(和示例输出)是否正确?
  2. 其他寄存器对(AF、BC、DE)的功能是否完全相同?
  3. 如果 1. 和 2. 的答案是肯定的,那么为什么 Z80 被认为是小端序?当 HL 寄存器内容被写入内存时,L 字节首先出现,但是(当随后按顺序读取它们时,字节肯定是大端序)?
4

2 回答 2

9

是 — HL 由 H 作为最高有效字节,L 作为最低有效字节组成。如果您执行 16 位操作,ADD HL,BC那么从 的最高位进位L+C将流入 的计算H+B。在这方面,所有寄存器对都是相似的。

那是因为写东西的逻辑顺序与字节序无关。例如,在 C 语言中,您不必0x0001在某些平台上编写就可以在其他平台上平等0x0100。写作时,你先写最重要的。

z80 是小端的,因为如果你要存储HL到内存中,L会在H. 如果要读取,L会从之前的地址读取H

于 2014-02-08T02:55:13.020 回答
3
ld hl, $1234
ld ($fc00), hl

此时,如您的代码所示,H = 12 美元,L = 34 美元。$fc00 处的字节 = $34,$fc01 处的字节 = $12。因此,如果您随后这样做:

ld hl, $5678
ld ($fc02), hl

($fc00) = $34, ($fc01) = $12, ($fc02) = $78, ($fc03) = $56。因此,从 $fc00 逐字节读取,内存将是 $34127856,而不是$12345678,因为 Z80 是小端序。

于 2014-02-26T07:14:03.893 回答