汇编语言指令到机器语言指令

时间:2016-07-20 01:14:05

标签: assembly binary opcode operands

参考:reference 问题:question

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

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.

2 个答案:

答案 0 :(得分:2)

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

首先,ld有两个版本,一个用于内存加载,另一个用于恒定加载。问题中的一个是内存负载,它有操作码0x30Ri只是操作数的寄存器编号,这里显然是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。