计算机如何区分数据和指令?

How does a computer distinguish between Data and Instructions?

我在 8 位 PC 上观看了一个 video 正在输入程序 - 手动,使用物理开关。

美联储计划是:

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未定义。

您即将意识到一个重要的问题:没有元数据,数据就没有意义 - 为了理解给定的位序列,必须有一些"knowledge" 关于应该如何解释这些位。

就指令而言,CPU的指令集定义了每条指令及其附带数据的大小。每条指令都以操作码开头,后面的数据通常是固定大小(大小取决于操作码)。每条指令按顺序执行(直到遇到跳转指令),从硬连线到 CPU.

的某个初始地址开始

所以如果初始地址恰好是MAIN标签的地址,CPU看到的第一个操作码将是0000 0001,所以它会知道它是LDA 指令,它知道应该后跟一个四位数字。这四位之后的是下一条指令。

如果稍后执行错误的跳转指令,将 CPU 发送到示例中的第三位组,会发生什么情况? (根据您的示例,我猜测 CPU 以四位 "bytes" 运行。)然后确实, CPU 会将 0100 0001 误认为操作码和一些以下位的数量作为该操作码的数据,事情很可能会出错。

在计算机系统中,指令的地址来自PC(程序计数器),而数据的地址不是来自PC。这就是它们的区别。