我正在尝试了解计算机的实际工作原理,我找到了一些模拟器软件,但似乎非常复杂(我仍然是初学者)。我看到了 非常古老的Little Man Computer (LMC) 。恐怕该软件的工作方式与当今的实际情况不同。
那么,Little Man Computer 对我学习计算机的工作原理仍然有用吗?有更好的吗?
我正在尝试了解计算机的实际工作原理,我找到了一些模拟器软件,但似乎非常复杂(我仍然是初学者)。我看到了 非常古老的Little Man Computer (LMC) 。恐怕该软件的工作方式与当今的实际情况不同。
那么,Little Man Computer 对我学习计算机的工作原理仍然有用吗?有更好的吗?
LMC 是像真正的计算机一样的冯诺依曼架构,但在其他重要方面,它从未像真正的计算机那样,现在更不像(例如,作为累加器机器)。
它仍然被用作教授一些汇编语言基础知识的玩具架构。SO 有一个带有约 50 个问答的标签。
还有其他玩具 ISA,例如 LC-3,它们很简单,但是是具有多个寄存器的二进制计算机。与为您的“局部变量”提供少量寄存器相比,累加器机器在汇编中手动编程是不必要的痛苦。 LC-3 是一个带有 8 个 16 位寄存器的 16 位 ISA。指令宽度为 16 位,操作码为 4 位。 与 LMC 不同,包括 LC-3 在内的大多数玩具 ISA 都是基于二进制数的,并且具有间接寻址,您可以在其中使用寄存器作为加载或存储的地址。
LMC 没有间接内存寻址:加载和存储指令必须将绝对地址硬编码到程序中。因此,如果您想循环遍历数组或使用查找表,您需要编写自修改代码,将新地址存储到将作为代码执行的“邮箱”中。
被迫编写自修改代码来进行某些类型的计算与现代计算机中的情况非常不同。大多数 ISA 都是图灵完备的(有限内存除外)和/或可以是没有自修改代码的 C 编译器的目标,即如果您愿意,可以将指令保存在只读内存中。
了解 SMC 是可能的(例如用于 JIT 编译)是很有用的,但不要了解它是取消引用指针的正常方法。
LMC 具有一些用于真实 CPU 的汇编语言原则(一次执行一条指令,这会对架构状态进行一些更改)。
但它特别避免提供任何二进制操作,如按位与、移位或类似的操作。这使得一些在真实计算机中容易的事情在 LMC 中变得困难。
(维基百科):LMC 通常用于教授学生,因为它模拟了一个简单的冯诺依曼架构计算机——它具有现代计算机的所有基本特征。它可以用机器代码(尽管是十进制而不是二进制)或汇编代码进行编程。
它仅通过add
and操作对数字进行sub
操作,而不依赖于以 binary 表示的数字。他们可以和房间里的小人一起使用纸上的十进制数字或弹珠的集合。它被有意简化到这一点,但是当你知道真正的计算机可以非常有效地执行除以 2 之类的事情时,编程真的很烦人,而在 LMC 上你需要一个愚蠢的循环来重复减法,或者用表格的花哨技巧你的除数的权力。
LMC 有一些其他玩具机器(如 LC3)没有的奇怪限制:数字必须是正数。 如何创建将获得数字的 Little Mans Computer (LMC) 代码。如果数字是奇数则显示 1,如果数字是偶数则显示 0说明这需要您小心避免这种情况,因为它在“ISA”中未定义,并且不同的模拟器对 add 或 sub 溢出的处理方式不同。
它还表明,在 LMC 中测试奇数/偶数(二进制或十进制微不足道)是一个很大的痛苦,因为您无法利用任何二进制或其他位置值表示。
相比之下,大多数其他玩具 ISA(与所有现代真实 ISA 一样)使用 2 的补码作为有符号数。IMO 学习二进制整数是汇编语言的重要组成部分。
@trincot 还写了一些其他不错的 LMC 答案,包括关于LMC 中以 4 开头的小人的指令会发生什么?
当然,大多数 ISA 是按照顺序执行一条指令然后执行下一条指令来定义的。实际实现通常并行执行多个(当指令级并行性允许时),同时保持这种错觉。
如果需要,您可以构建超标量无序 LMC 或 LC-3;程序员不需要知道这一点,除非 ISA明确了并行性,例如 Mill 或 IA-64 的明确推测,或 MIPS 上的加载/分支延迟槽。
请参阅http://www.lighterra.com/papers/modernmicroprocessors/以及有关真实 CPU 如何并行执行多条指令的答案。
请注意,自修改代码对于超标量 CPU 来说是个问题;例如,当您修改流水线中正在运行的代码附近的内存字节时,真正的 x86 CPU 会刷新流水线。