assembly Z80 16位加载指令与字节序

rekjcdws  于 2023-02-08  发布在  其他
关注(0)|答案(2)|浏览(128)

我正在用C#编写一个ZX Spectrum模拟器,"为了好玩"(我想我后悔已经开始了)。
我知道Z80是小端字节序,所以在RAM中,低位字节首先存储。
我似乎找不到一个明确的答案,是它如何与16位LD指令的行为。
例如:

LD BC, 0x1234

在此之后,B是否包含0x12C是否包含0x34,或者反之亦然?
因此,在执行上述操作之后,如果我执行:

LD A, 0x56
LD (BC), A

内存0x12340x3412是否包含0x56
如果有人能提供一个可靠来源的链接就好了。

68bkxrlz

68bkxrlz1#

只有当我们将一个16位值拆分为两个8位片段时,字节序才起作用,* 而且有多种方法可供选择,当这样一个16位值存储在内存中时,就会出现这种情况 *,例如:

  • 在指令中使用立即数的 * 编码 *,如ld bc, 0x1234:查看此指令的机器代码的各个字节,我们将看到0x010x340x12,其以小端字节序存储0x1234。
  • 如果内存中的数据是16位值,并且查看内存中的各个字节,则需要字节序,因此使用小字节序。

但是,如果BC寄存器对加载了值0x1234,那么间接使用BC将使用该内存地址,这不存在字节序问题,因为我们在此场景中不查看单个字节。
现在,如果您想知道BC寄存器是如何由BC组成的,那么我们必须知道哪个是高位,哪个是低位。
来自手册:
按下BC即按下B,然后按下C
因此,这意味着堆栈存储器将在比C存储位置高+1的地址上存储C的值,然后存储B的值。由于存储器中的16位数据使用小端字节顺序存储,因此我们可以得出结论,C是BC 16位寄存器对的低位,B是高位。
因此,BCB * 256 + C,但我们要注意,这只是根据定义,而不是真正的字节序-因为没有对单个字节的"寻址",也没有内存中的其他排序(由于内存既有地址又有值)。
然而,选择哪个高哪个低并不会改变它们一起保持值0x1234,正如我们的示例所示。

ar7v8xwq

ar7v8xwq2#

制造商数据手册来源可靠吗?Z80用户手册当然,在内存中,操作码首先是0x34,然后是0x12

相关问题