汇编语言指令转化为机器语言指令

Assembly Language instruction into Machine language instruction

参考: 问题:

我得到的值与他们在回答中得到的值不同。

ld(立即数)的操作码是 0x31 = 0011 0001 值为 0x10A = 0001 0000 1010。 这里的Ri寄存器我不知道怎么算。

ld (0x31) 的物理格式是两个字长。

字 1:第 7-2 位用于操作码。因此 ld 的二进制序列缩短为 110001 位

位 1-0 用于 Ri。

字 2:所有 8 位保留值

10A = 0001 0000 1010 缩短为... 0000 1010? 0001呢? :(

我的结果 - 1100 01 Ri 0000 1010。

是的,图片中的答案是错误的,那是 0x10D 而不是 0x10A。你的也不对。

首先,ld有两个版本,一个用于内存加载,一个用于常量加载。问题中的一个是内存负载,它有操作码 0x30Ri只是操作数的寄存器号,这里明明是1。因此,第一个字节看起来像 1100 0001(这在图像中是正确的)。然后你只需要将常量作为两个字节放在它后面,big endian。

所以,正确答案是1100 0001 0000 0001 0000 1010

查看问题中包含的文档,提出了几个说明。该机器有四个 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 位寄存器(R0、R1、R2 或 R3)设置为指定地址的 8 位值。

加载指令的实际位格式为:(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 作为 add 的 0x10 操作码,01 用于寄存器 R1,11 用于寄存器 R3。添加指令的第二个 8 位部分中的剩余 6 位未使用并被忽略。

sto R1,0x10B应该看起来像 1100 1001 0000 0001 0000 1011,它是 0x32 的操作码,寄存器 1,存储在 0x010B 的 16 位地址。