查看问题中包含的文档,提出了一些说明。该机器有四个 8 位寄存器,编号为 R0、R1、R2 和 R3,使用两位寻址。
指令的操作码在文档中指定为两个十六进制数字。但是在实际实现中,指令的操作码区域不是两个十六进制数字,因此您必须取十六进制值并将该值左移 2 位。因此,加载 0x30 (0011 0000) 的操作码左移导致 0xC0(二进制 1100 0000)或存储 0x32 (0011 0010) 的操作码左移导致 0xC8 (1100 1000) 和将零到三的寄存器号插入两个十六进制数字的低两位。
从地址加载指令是ld Ri,xxxx,其中xx 是包含要加载到寄存器中的8 位值的位置的16 位地址。此加载指令使用指定地址处的 8 位值设置指定的 8 位寄存器(R0、R1、R2 或 R3)。
加载指令的实际位格式为:(1) 最高有效 6 位中的操作码 (0x30) 后跟 (2) 接下来两位中的寄存器编号 (0 - 3),后跟 (3)一个 16 位值,它是要加载的值的地址。
ld R1,0x10A 在二进制中应该看起来像 1100 0001 0000 0001 0000 1010,它将 1100 00 作为操作码 0x30,01 作为寄存器编号 R1,0000 0001 0000 1010 即 0x010A。
立即加载 ld R3,$-12 应该看起来像 1100 0111 1111 0400 因为 -12 是 0xfff4
假设未使用的位设置为零,add R1,R3 应该看起来像 0100 0001 1100 0000。这将是 010000 作为加法的 0x10 操作码,01 用于寄存器 R1,11 用于寄存器 R3。加法指令的第二个 8 位部分中的剩余 6 位未使用并被忽略。
sto R1,0x10B 应该看起来像 1100 1001 0000 0001 0000 1011,它是 0x32 的操作码,寄存器 1,要存储在 0x010B 的 16 位地址。