这可能是一个非常奇怪的问题,但我一直在做一些关于小人电脑的工作,这让我有点恼火,不仅没有 4 号操作代码,而且互联网上绝对没有关于原因的信息。
操作码从 0 到 9,但跳过 4。从来没有任何以 4 开头的三位数字代码吗?如果有会发生什么?
有没有人可以帮助回答这个问题?我只是觉得很奇怪。谢谢!
这可能是一个非常奇怪的问题,但我一直在做一些关于小人电脑的工作,这让我有点恼火,不仅没有 4 号操作代码,而且互联网上绝对没有关于原因的信息。
操作码从 0 到 9,但跳过 4。从来没有任何以 4 开头的三位数字代码吗?如果有会发生什么?
有没有人可以帮助回答这个问题?我只是觉得很奇怪。谢谢!
Little Man Computer (LMC) 最初并未作为完整的规范提出。它更多是一种模式,一种范式。有几件事未定义,例如当遇到未使用的操作码 4 时应该发生什么。LMC 的目的是向学生介绍机器代码和指令集的概念,并证明计算机的力量并非来自复杂性。其目的并不是解释设计不良的代码所发生的所有细节。
没有定义应该发生什么。在具体实现中,会做出选择:要么导致程序异常终止(如此处所述),要么作为无操作指令执行,或者仍然执行其他操作(非常不可能)。主要信息是程序不应该依赖于特定的实现选择,也不应该遇到这样的操作码。如果您真的想知道会发生什么,那么这是一个规范,应该在特定实现(模拟器)附带的文档中找到。
There is no particular reason why 4 is unused. The initial LCM (in 1965) had a slightly different set, where it seems that opcode 4 was used. The more popular set was introduced later, and is also presented in "The Architecture of Computer Hardware and System Software" (Irv Englander). Several other implementations of LCM describe extensions (like here) where opcode 4 gets a use.
There is one benefit I have found with the undefined 4 opcode, although I consider this benefit unintended, and it is only applicable when an LMC implementation aborts (with an error message) when it bumps into a 4 opcode:
当一个程序需要管理一个数组时,它必须使用自修改代码来实现间接寻址。此类程序可能没有代码来检测数组是否溢出了可用邮箱的数量,在这种情况下,无效的 4 操作码“功能”将极大地帮助调试出错的地方。
以下面的程序为例,它读入可变数量的输入,给定第一个输入,指示后面还有多少输入。它将这些输入存储为一个数组。我不包括这个数组的处理,它可以是任何东西......例如排序:
#input: 90 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
INP
BRZ zero ; nothing to do
STA size ; for later reference
loop SUB one
BRP continue
HLT ; placeholder for some processing
continue STA counter
INP
dynamic STA array
LDA dynamic
ADD one
STA dynamic
LDA counter
BRA loop
zero DAT 0
one DAT 1
size DAT
counter DAT
array DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.77/lmc.js"></script>
请注意,当您使用默认提供的 91 个输入运行此代码段时会发生什么。特别关注标有“动态”的行。这是需要自我修改的行:它是一个 STA 指令,负责将最后一个输入存储在增长数组的下一个槽中。它的操作码是 4xx。但是当这个 xx 变得太大时,操作码从 399 移动到 400,突然变成了一条无效指令。这实际上很好,因为现在程序将立即停止。
如果 4xx 操作码是有效的,程序会继续执行,但它肯定不会按照预期执行,而且更难找出原因。
https://web.archive.org/web/20131211112403/http://www.acs.ilstu.edu/faculty/javila/lmc/
这列出了一个完全不同的指令集(例如输入/输出是 500/600)。