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

时间:2016-09-18 07:46:12

标签: assembly machine-code microprocessors 8-bit

我在一台8位电脑上观看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 0001 0010可以解释为:

1 = LDA [2]

或:

1 = #10

是否因为程序运行时,地址被视为指令。但由于HLT,程序停止执行内存地址,就像它们是指令一样,并留下更高的地址;然后LDA / ADD / SUB等将内存中的所有位置视为二进制值。

在这种情况下,会:

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

2 个答案:

答案 0 :(得分:5)

你正处于一个重要的实现的边缘:数据没有元数据没有意义 - 为了理解给定的比特序列,必须有一些&#34;知识和# 34;关于如何解释这些比特。

就指令而言,CPU的指令集定义了每条指令的大小及其伴随数据。每条指令都以操作码开头,以下数据通常是固定大小(大小取决于操作码)。每个指令按顺序执行(直到遇到跳转指令),从硬连接到CPU的某个初始地址开始。

因此,如果初始地址恰好是MAIN标签的地址,则CPU看到的第一个操作码将为0000 0001,因此它将知道它是LDA它知道应该跟随一个四位数的指令。无论如何,这四位是下一条指令。

如果稍后执行错误的跳转指令,将CPU发送到示例中的第三个位组,会发生什么? (根据你的例子,我猜测CPU使用四位&#34;字节&#34 ;.)然后,CPU确实会将0100 0001误认为操作码和一些数字的跟随位作为该操作码的数据,事情可能会非常错误。

答案 1 :(得分:0)

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