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

Assembly 计算机如何区分数据和指令?,assembly,machine-code,microprocessors,8-bit,Assembly,Machine Code,Microprocessors,8 Bit,我看到一台8位pc上的一台计算机正在通过物理开关手动输入一个程序 美联储的计划是: 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

我看到一台8位pc上的一台计算机正在通过物理开关手动输入一个程序

美联储的计划是:

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]
或:

是因为当程序运行时,地址被视为指令。但是由于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
,将下面的一些位误认为是该操作码的数据,事情很可能会出错。

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

这里有一个类似的主题,有很好的答案:。你可能会喜欢:“……他写的每一条指令也可以被视为一个数字常量……”大部分是和的副本
0010 0000 1110      # 4 = NOP [14]
0101 0001 1100      # 5 = LDA [12]