繁体   English   中英

将汇编语言指令转换为机器语言指令

[英]Assembly Language instruction into Machine language instruction

参考: 参考 题: 题

我没有得到与他们的答案相同的价值观。

ld(立即)的操作码是0x31 = 0011 0001,值是0x10A = 0001 00001010。我不知道如何在此说明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具有两种版本,一种用于内存加载,一种用于恒定加载。 问题中的一个是内存负载,它的操作码为0x30 Ri只是操作数的寄存器号,在这里显然是1 因此,第一个字节看起来像1100 0001 (在图像中这是正确的)。 然后,您只需要将常量作为两个字节放在大字节后即可。

因此,正确答案是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位值设置指定的8位寄存器(R0,R1,R2或R3)。

加载指令的实际位格式为:(1)最高有效6位的操作码(0x30),其次是(2)接下来两位的寄存器号(0-3),其次是(3)一个16位value是要加载的值的地址。

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位地址中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM