我没有得到与答案中相同的价值观。
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日0000 1010.
答案 0 :(得分:2)
是的,图像中的答案是错误的,那是0x10D而不是0x10A。你的错也是。
首先,ld
有两个版本,一个用于内存加载,另一个用于恒定加载。问题中的一个是内存负载,它有操作码0x30
。 Ri
只是操作数的寄存器编号,这里显然是1
。因此,第一个字节看起来像1100 0001
(这在图像中是正确的)。然后你只需要把它后面的常量作为两个字节,big endian。
所以,正确的答案是1100 0001 0000 0001 0000 1010
答案 1 :(得分:1)
查看问题中包含的文档,有几条说明正在提出中。该机器有四个8位寄存器,编号为R0,R1,R2和R3,使用两位进行寻址。
指令的操作码在文档中指定为两个十六进制数字。但是在实际实现中,指令的操作码区域大小不是两个十六进制数字,因此您必须取十六进制值并将值左移2位。因此,加载0x30(0011 0000)的操作码左移,导致0xC0(二进制1100 0000)或者存储0x32(0011 0010)的操作码左移,导致0xC8(1100 1000)和寄存器号0到3插入到两个十六进制数字的低两位。
地址指令的加载为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。 / p>
加载立即ld R3,$-12
应该看起来像1100 0111 1111 0400,因为-12是0xfff4
假设未使用的位设置为零,add R1,R3
应该看起来像0100 0001 1100 0000。这将是010000作为add的0x10操作码,寄存器R1的01和寄存器R3的11。添加指令的第二个8位部分中的剩余6位未使用并被忽略。
sto R1,0x10B
应该看起来像1100 1001 0000 0001 0000 1011,其操作码为0x32,寄存器1,存储在16位地址0x010B。