我看了一个video在 8 位电脑上输入程序 - 手动,使用物理开关。
美联储计划是:
MAIN:
0000 0001 0100 # 0 = LDA [4]
0001 0010 0101 # 1 = ADD [5]
0010 0101 0000 # 2 = OUT
0011 1111 0000 # 3 = HLT
DATA:
0100 00001110 # 4 = #14
0101 00011100 # 5 = #28
我想知道的是计算机如何区分数据和指令,因为没有标志将数据与指令分开。
0001 0001 0010 可以解释为:
1 = LDA [2]
或:
1 = #10
是不是因为在程序运行的时候,地址被当成了指令。但是由于 HLT,程序停止执行内存地址,就好像它们是指令一样,并留下更高的地址;然后 LDA/ADD/SUB 等将内存中的所有位置视为二进制值。
在那种情况下,会:
0000 0010 0000 解释为:
0 = ADD #32
不是
0 = ADD [ ADD [ ADD [ ADD ...]]]
** 在写这个问题的过程中,我意识到了一些新的东西
更好的例子:
如果不存在停止,程序是否可以正常工作,但随后继续向下处理数据并解释为:
0010 0000 1110 # 4 = NOP [14]
0101 0001 1100 # 5 = LDA [12]
如果是这样,计算机会不会崩溃 1:因为 NOP 被赋予了一个操作数,以及 2:因为内存地址 12 和 14 是未定义的。
最佳答案
您即将认识到一个重要的事实:没有元数据,数据就没有意义 - 为了理解给定的位序列,必须有一些“知识”来了解那些如何位应该被解释。
就指令而言,CPU 的指令集定义了每条指令及其附带数据的大小。每条指令都以操作码开头,随后的数据通常固定大小(大小取决于操作码)。每条指令按顺序执行(直到遇到跳转指令),从硬连线到 CPU 的某个初始地址开始。
因此,如果初始地址恰好是 MAIN
标签的地址,CPU 看到的第一个操作码将是 0000 0001
,因此它会知道它是一个 LDA
指令,它知道后面应该跟着一个四位数。这四位之后的内容就是下一条指令。
如果稍后执行错误的跳转指令,将 CPU 发送到示例中的第三位组,会发生什么情况? (根据您的示例,我猜测 CPU 以四位“字节”运行。)然后确实,CPU 会将 0100 0001
误认为操作码和以下一些位作为该操作码的数据,事情很可能会出错。
关于assembly - 计算机如何区分数据和指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39555288/