如果您有项目清单,请说
由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
工作原理:
从格式中我们看到每条指令的长度为 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
位置s
和d
两位数。
add r4 r6
是060406
。
剩下的作业是在数字之间进行转换(例如 6106 hex 中的 060406 oct),它实际上独立于 PDP-11 编码。
到处都有很多可用的材料。
其余指令的编码、其余寻址模式和实现留给读者作为练习。