2 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 # 5 = #28
Run Code Online (Sandbox Code Playgroud)
我想知道的是计算机如何区分数据和指令,因为没有标记可以从指令中划分数据.
0001 0001 0010可以解释为:
1 = LDA [2]
Run Code Online (Sandbox Code Playgroud)
要么:
1 = #10
Run Code Online (Sandbox Code Playgroud)
是因为在程序运行时,地址被视为指令.但由于HLT,程序停止执行内存地址,就像它们是指令一样,并留下更高的地址; 然后LDA/ADD/SUB等将内存中的所有位置视为二进制值.
在那种情况下,会:
0000 0010 0000可解释为:
0 = ADD #32
Run Code Online (Sandbox Code Playgroud)
并不是
0 = ADD [ ADD [ ADD [ ADD ...]]]
Run Code Online (Sandbox Code Playgroud)
**在写这个问题的同时,我意识到新事物正在进行中
更好的例子:
如果暂停不存在,程序是否正常工作,但继续下载数据并解释为:
0010 0000 1110 # 4 = NOP [14]
0101 0001 1100 # 5 = LDA [12]
Run Code Online (Sandbox Code Playgroud)
如果是这样,计算机是否会崩溃1:因为NOP被赋予操作数,而2:因为存储器地址12和14未定义.
您正处于重要实现的边缘:没有元数据,数据没有意义 - 为了理解给定的位序列,必须有一些关于如何解释这些位的"知识".
就指令而言,CPU的指令集定义了每条指令的大小及其伴随数据.每条指令都以操作码开头,以下数据通常是固定大小(大小取决于操作码).每个指令按顺序执行(直到遇到跳转指令),从硬连接到CPU的某个初始地址开始.
因此,如果初始地址碰巧是MAIN标签的地址,那么CPU看到的第一个操作码将是0000 0001,因此它将知道它是一条LDA指令,它知道应该跟随一个四位数.随后是这四位是下一条指令.
如果稍后执行错误的跳转指令,将CPU发送到示例中的第三个位组,会发生什么?(基于你的例子,我猜测CPU使用四位"字节"运行.)然后,实际上,CPU会误认为0100 0001操作码和一些后续位作为该操作码的数据,事情将会可能会出错.
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |