我爬
冯诺依曼模型是一种计算机架构模型,通过不同的设备组件实现复杂的可编程控制。
内存基于门控存储电路,是一种临时存储设备,拥有读写两种操作。通过两个寄存器来实现读写:
名称 | 全名 | 作用 |
---|---|---|
MAR | Memory Address Register | 对该寄存器内数字对应的内存地址进行操作 |
MDR | Memory Data Register | 内存操作的操作数。写时存放写的数据,读时存放读出来的数据 |
内存读写之 - - 读操作
内存读写之 - - 写操作
运算单元支持简单算数运算与逻辑运算,除此之外,运算单元需要寄存器来保存运算结果。
通过 KBSR KBDR DSR DDR 来实现对键盘的读取和显示的输出。这些寄存器在后面的章节会详细介绍。
通过 IR 和 PC 寄存器来实现指令的跳转。大部分情况在执行一条指令之后,PC都会++(顺序执行
名称 | 全名 | 作用 |
---|---|---|
IR | Instruction Register | 存放当前指令的内容。 |
PC | Program Counter | 存放下一条要指向的指令的地址 |
通过二进制数字来表示指令,一条完整的指令需要两个部分
比如 ADD 指令,我们需要将 src1 src2 寄存器 中的数字相加,然后存到 dst 寄存器中
一个指令被执行的全过程。
PC + 偏移
寻址根据操作数,从对应的内存地址中获取数据的行为,叫做寻址。LC-3中有三种方式获得内存中的数据。
LC-3是一种非常原始的指令集,它具有以下的特点:
除此之外,还有系统状态寄存器等等不可访问的寄存器。比如 nzp 条件码,nzp表示最后一次操作的结果,是负,零,正数。下面的指令表中,带+号的表示会改变nzp条件码。
ADD 和 AND,都有两种模式,即立即数模式和寄存器模式。立即数是跟在指令后面的几位数字,通常用于简易运算,比如++运算中。
比如加法,立即数模式下,DR = SR + imm
LD, LDI, LDR,ST,STI,STR
数据搬移指令分为读写两部分,先介绍读指令:
其中 LD 和 LDR 为直接寻址。LD使用 PC+偏移
找到内存地址并且取数据。LDR使用 基址寄存器内的数值+偏移
的方式找到内存地址并且取数据。
LDI 是间接寻址模式,即先找到内存PC+偏移
处的数据 x,将 x 作为地址,找内存 x 地址处的数据为最终结果。(即指针寻址)
通过流程控制指令实现跳转与分支。其中
BR指令较为特殊,根据 nzp (某个寄存器中的字段)来确定是否跳转(有条件)。nzp表示 负,零,正。其中某些运算指令能够改变 nzp 的值,比如 ADD AND NOT LEA 等等
JMP 是绝对跳转,无条件。
JSR 与 JSRR 是函数(栈帧)调用时的跳转,会将返回地址压栈,并且改写系统状态,这在后面的章节细。
除此之外,TRAP是中断函数的调用,这个也会改变系统状态,后面细
LEA指令比较特殊,他是计算地址的指令。将 PC+偏移
的值计算好,存入目标寄存器。值得注意的是,LEA指令并不访问内存,仅仅只是计算而已。所以有时候可以用LEA进行简单的加减法。
LEA R1 32 即 R1 = pc + 0x20 = 。当前 pc = 0x3101(由左边可得),那么 R1 = 0x3121
LD R2 32 即 R2 = 内存[pc+0x20]。当前 pc = 0x3102,那么 R2 = 内存[0x3122] = 0x4566
LDI R3 32 即指针寻址 R3 = 内存[内存[pc+0x20]] = 内存[内存[0x3123]] = 内存[0x3567] = 0xABCD
LDR R4 R2 1 即基址+偏移寻址。R4 = 内存[R2的值 + 1] = 内存[0x4566 + 1] = 0xABCD
哦 有答案了,那没事了