【问题标题】:What happens to instructions given to the Little man in the LMC that begin with 4?LMC 中以 4 开头的小人指令会发生什么?
【发布时间】:2017-03-03 13:08:56
【问题描述】:

这可能是一个很奇怪的问题,但我一直在做小人电脑上的一些工作,这让我有点恼火,不仅没有 4 号操作代码,而且互联网上绝对没有关于为什么。

操作码从 0 到 9,但跳过 4。从来没有任何以 4 开头的三位数代码吗?如果有会怎样?

有没有人可以帮助回答这个问题?我只是觉得很奇怪。 谢谢!

【问题讨论】:

  • 可能是因为中文中的死亡发音与4的发音相似。也可能不是。
  • 还有 0xx(000 除外)和更多的 9xx 未定义

标签: opcode little-man-computer


【解决方案1】:

Little Man Computer (LMC) 最初并未以完整规范的形式呈现。它更多是一种模式,一种范式。有几件事未定义,例如当遇到未使用的操作码 4 时应该发生什么。 LMC 的目的是向学生介绍机器代码和指令集的概念,并证明计算机的力量并非来自复杂性。与其说是解释设计不良的代码所发生的所有细节,不如说是目的。

没有定义应该发生什么。在具体实现中,会做出选择:要么导致程序异常终止(如here 所述),要么作为无操作指令执行,或者仍然执行其他操作(非常不可能)。主要信息是程序不应该依赖于特定的实现选择,并且应该永远遇到这样的操作码。如果你真的想知道会发生什么,那么这是一个规范,应该在文档中找到一个特定实现(模拟器)。

没有使用 4 的特殊原因。最初的 LCM(1965 年)的设置略有不同,似乎使用了操作码 4 。后来介绍了更流行的集合,并且在“计算机硬件和系统软件的体系结构”(Irv Englander)中也有介绍。 LCM 的其他几个实现描述了操作码 4 得到使用的扩展(如 here)。

一个(意外?)好处

我发现未定义的 4 操作码有一个好处,尽管我认为这种好处是无意的,而且它仅适用于遇到 LMC 实现中止(带有错误消息)时一个 4 操作码:

当一个程序需要管理一个数组时,它必须使用自修改代码来实现间接寻址。此类程序可能没有代码来检测数组是否溢出了可用邮箱的数量,在这种情况下,无效的 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 个输入运行此 sn-p 时会发生什么。特别关注标有“动态”的行。这是需要自我修改的行:它是一个 STA 指令,负责将最后一个输入存储在增长数组中的下一个槽中。它的操作码是 4xx。但是当这个 xx 变得太大时,操作码从 399 移动到 400,突然变成了一条无效指令。这实际上很好,因为现在程序将立即停止。

如果 4xx 操作码是有效的,程序会继续执行,但它肯定不会按照预期执行,而且更难找出原因。

【讨论】:

    【解决方案2】:

    https://web.archive.org/web/20131211112403/http://www.acs.ilstu.edu/faculty/javila/lmc/

    这列出了一个完全不同的指令集(例如输入/输出是 500/600)。

    【讨论】:

    • 这为这个特定的模拟器列出了 4 个。但是许多其他模拟器根本不使用 4。
    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多