【问题标题】:Assembly Language instruction into Machine language instruction汇编语言指令到机器语言指令
【发布时间】:2016-07-20 01:14:05
【问题描述】:

参考: 提问:

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

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。

【问题讨论】:

    标签: assembly binary opcode operands


    【解决方案1】:

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

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

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

    【讨论】:

    • 再次感谢 Jester,很明显我将图片中的立即地址模式和直接地址模式混为一谈
    【解决方案2】:

    查看问题中包含的文档,提出了一些说明。该机器有四个 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 位值,它是要加载的值的地址。

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

    【讨论】:

      猜你喜欢
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2019-12-10
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多