计算机如何区分数据和指令?
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。这就是它们的区别。
我在 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。这就是它们的区别。