参考资料:

问题:

我得到的价值和他们在回答中所得到的不一样。
ld (立即)的操作码为0x31 =00110001,值为0x10A = 0001 0000 1010。我不知道如何在这里记帐。
ld (0x31)的物理格式是两个字长。
字1:位7-2为操作码.因此,ld的二进制序列被缩短到110001位。
位1-0是给Ri的。
字2:为值保留的所有8位
10A = 0001 0000 1010被缩短为. 0000 1010?那0001呢?
我的结果是1100 01 Ri 0000 1010。
发布于 2016-07-20 01:51:14
考虑到问题中所包含的文件,现正在提出几项指示。该机器有四个8位寄存器,它们编号为R0、R1、R2和R3,它们使用两位进行寻址。
这些指令的op代码在文档中被指定为两个十六进制数字。然而,在实际的实现中,指令的op代码区域并不是两个十六进制数字,所以您必须使用十六进制值并移动2位留下的值。因此,对负载为0x30 (0011 0000)的op代码左移,导致0xC0 (1100 0000二进制),或使存储区0x32 (0011 0010)的op代码左移,从而产生0xC8 (1100 1000),并将0到3的寄存器编号插入到两个十六进制数字的下两个位中。
从地址加载指令是ld Ri,xxxx,其中xx是包含要加载到寄存器的8位值的位置的16位地址。此加载指令将指定的8位寄存器(R0、R1、R2或R3)设置为指定地址的8位值。
加载指令的实际位格式是:(1)最重要的6位中的op代码(0x30),其次是(2)接下来两位中的寄存器号(0-3),其次是(3)一个16位值,该位值是要加载的值的地址。
然后,ld R1,0x10A应该以二进制方式显示为1100 0001 0000 0001 0000 1010,作为op代码0x30、01作为寄存器号R1和0000 000000 1010作为0x010A分开。
立即加载的ld R3,$-12应该类似于1100 0111 1111 0400 as -12是0 0xfff4 4。
假设未使用的位设置为零,则add R1,R3应该看起来像010000011000000。添加的0x10op代码为010000,寄存器R1为01,寄存器R3为11。添加指令的第二8位部分中的其余6位未使用并被忽略。
sto R1,0x10B应该看起来像1100 1001 0000 0001 0000 1011,这是op代码0x32,寄存器1,存储在0x010B的16位地址。
发布于 2016-07-20 01:22:41
是的,图像中的答案是错误的,那是0x10D,而不是0x10A。你的也错了。
首先,ld有两个版本,一个用于内存加载,另一个用于常量加载。问题中的一个是内存负载,它有操作码0x30。Ri只是操作数的寄存器号,这显然是1。因此,第一个字节看起来像1100 0001 (在图像中是正确的)。然后,只需将常量作为两个字节放在后面,大端字节。
所以,正确的答案是1100 0001 0000 0001 0000 1010
https://stackoverflow.com/questions/38470809
复制相似问题