1

我被分配了一项任务,我要为应用程序的编码和解码按钮编写 actionPreformed 方法,在该应用程序中,用户可以假设编码/解码 PDP-11 指令(仅限于ADD, SUB, MOV[B], CMP[B])。该应用程序应该能够获取 4 位十六进制数或 16 位二进制并将其解码为汇编,或输入其中一条汇编指令并将其编码为二进制/十六进制。

这对我来说都是新事物,我似乎无法思考如何做到这一点。有没有人有办法更简单地打破这个过程,或者有什么我应该从哪里开始的指针?我不太确定从哪里开始。谢谢!

4

1 回答 1

4

如果您有项目清单,请说

  • 灯罩
  • 镊子
  • 玻璃
  • 花卉

randomlists.com提供

您可以为每个人分配一个数字(1 = 灯罩,2 = 镊子等),我们称之为编码
这将事物映射为数字,但是数字仍然是抽象的概念,我们需要使用具体的事物对其进行编码。
使用的具体事物的数量是有限的,并且在设计时是固定的,它决定了数字可以有多大。
由于当前和过去用于构建计算机的技术,习惯上使用有限的双稳态实体集对数字进行编码,每个实体有两个状态,我们传统上表示为“0”和“1”,n 个这样的条目有2 n 个可能的状态。
如果我们用图形表示一个特定状态,其中呈现单个实体的所有状态,我们最终会得到像“01101”这样的字符串。
在映射前k个自然数(因此包括0)时,在数字的编码(例如“01101”)和二进制系统(例如数字13,由数字01101表示)之间出现了自然映射。

因此,我们可以用有限大小的数字对事物进行编码,并用我们想要的任何数字基数来表达这些数字。
正如所见,特别感兴趣的是基数 2,其他重要的基数是八进制基数和十六进制基数。
它们的重要性源于这样一个事实,即每个基数中的数字都用精确数量的二进制数字(也称为位)表示,3 表示八进制,4 表示十六进制。
这会将长数字转换为短数字。

指令是(抽象的)东西,然后我们可以用数字对它们进行编码。
出现了一个困难:当考虑到它们的操作数时,指令有很多变体:add r0 r1并且add r0 r1是两个不同的东西,因此它们必须有两个不同的数字。
以这种方式进行会太长,相反,我们进行分类抽象,将我们正在编码的事物分解为本体部分并分别对每个部分进行编码。
诀窍是其中一些是微不足道的。

让我们看一个例子,假设我们有这样的十字路口

 \ | /
 --+--
 / | \

8条街道交汇的地方。
我们可以用 0 到 7 的数字对每条街道进行编码,将 0 设置在顶部道路上并顺时针计数。
这正好是一位八进制数,多么方便啊!
如果我们想对销售员从任何街道进入十字路口并在任何其他街道(包括同一条街道)退出的路径进行编码,我们可以使用两个八进制数字来实现:第一个是进入路径,第二个是出口一。
例如,37 表示他们从 SE 进入并继续向 NW。

我们将编码大量事物(64 条可能的路径)的问题简化为对一小部分事物(街道)进行编码。
如果我们进一步想编码推销员的诚实(无论是否诚实),我们可以添加另一个数字来做到这一点:0 = 不诚实,1 = 诚实。
因此124是一个诚实的推销员。
请注意,234 不是有效的编码,这是因为每个八进制数字是 3 位,但我们只需要一个(乳清二进制是首选方式)。

我们可以使用这种技术对操作数、寻址模式和指令的任何相关部分进行编码。
始终存在的一部分是指令的类型,这称为操作码或简称操作码。
幸运的是,我们不必进行编码,PDP-11 设计人员已经做到了。
我们需要找到指令集架构 (ISA) 参考,这里有一个

您需要仔细阅读该文档,尤其是使用的约定。
以下是编码的add工作原理:

ADD 指令的编码

从格式中我们看到每条指令的长度为 16 位,因此我们需要上限(16/3)= 6 个八进制数字(虽然第一个只能是 0 或 1)。
该格式还告诉我们,0-5 位是目标(2 个八进制数字),6-11 位是源(2 个八进制数字),12-15 位是操作码。
你可以看到这正是我们为编码我们的推销员旅程所做的。
在 PDP-11 ISA 中,destination 和 source 是同一个概念,这个概念称为Addressing mode
我们只考虑寄存器寻址模式,上面的链接有其他的。
当目标和源是寄存器时,它们的第一位是0,第二位是寄存器的编号。
你能看到为编码寄存器保留的位数(即 3)和寄存器的数量(即 8)之间的关系吗?

格式是

   2 digits      1  digit     1 digit
  ______         ___         ___
 |opcode|   0   |src|   0   |dst|

这是每两个操作数指令的通用格式(有道理),add具体是如何编码的,我们看一下格式正下方的表格。
它告诉我们操作码是06.

答对了!我们拥有一切,add(记住,只有寄存器)的一般格式是源寄存器和目标寄存器的060s0d位置sd两位数。

add r4 r6060406

剩下的作业是在数字之间进行转换(例如 6106 hex 中的 060406 oct),它实际上独立于 PDP-11 编码。
到处都有很多可用的材料。


其余指令的编码、其余寻址模式和实现留给读者作为练习。

于 2018-02-11T00:19:33.147 回答