我正在用C#编写一个ZX Spectrum模拟器,"为了好玩"(我想我后悔已经开始了)。
我知道Z80是小端字节序,所以在RAM中,低位字节首先存储。
我似乎找不到一个明确的答案,是它如何与16位LD
指令的行为。
例如:
LD BC, 0x1234
在此之后,B
是否包含0x12
,C
是否包含0x34
,或者反之亦然?
因此,在执行上述操作之后,如果我执行:
LD A, 0x56
LD (BC), A
内存0x1234
或0x3412
是否包含0x56
?
如果有人能提供一个可靠来源的链接就好了。
2条答案
按热度按时间68bkxrlz1#
只有当我们将一个16位值拆分为两个8位片段时,字节序才起作用,* 而且有多种方法可供选择,当这样一个16位值存储在内存中时,就会出现这种情况 *,例如:
ld bc, 0x1234
:查看此指令的机器代码的各个字节,我们将看到0x010x340x12,其以小端字节序存储0x1234。但是,如果
BC
寄存器对加载了值0x1234,那么间接使用BC
将使用该内存地址,这不存在字节序问题,因为我们在此场景中不查看单个字节。现在,如果您想知道
BC
寄存器是如何由B
和C
组成的,那么我们必须知道哪个是高位,哪个是低位。来自手册:
按下BC即按下B,然后按下C
因此,这意味着堆栈存储器将在比
C
存储位置高+1的地址上存储C
的值,然后存储B
的值。由于存储器中的16位数据使用小端字节顺序存储,因此我们可以得出结论,C是BC
16位寄存器对的低位,B是高位。因此,
BC
是B
* 256 +C
,但我们要注意,这只是根据定义,而不是真正的字节序-因为没有对单个字节的"寻址",也没有内存中的其他排序(由于内存既有地址又有值)。然而,选择哪个高哪个低并不会改变它们一起保持值0x1234,正如我们的示例所示。
ar7v8xwq2#
制造商数据手册来源可靠吗?Z80用户手册当然,在内存中,操作码首先是0x34,然后是0x12