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

标签 assembly machine-code microprocessors 8-bit

我看了一个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/

相关文章:

linux - 汇编 x86,在字符串中的每个单词后打印新行

assembly - PDP 8指令集长度比较

object - 汇编程序如何工作?

linux - 从计算机体系结构的角度来看,应用程序是如何执行的

assembly - 零/符号扩展是空操作,那么为什么要对每种尺寸类型进行说明呢?

linux - 程序集 x64 getcwd() 未输出

assembly - MASM程序集:存储浮点

assembly - MIPS 跳转和分支指令范围

ios - 为 iPhone 开发 8085 模拟器的指南

c - 内存栅栏如何工作?