本文是HIT计算机组成原理上课笔记,由于唐书有些内容讲的比较抽象,添加了一些王道的图片加以补充。
回忆计算机的工作过程
代码被编译器翻译成与之对等的机器指令,除了指令之外还会有一些数据同时被放到主存里
机器指令
指令格式
一条指令是机器语言的一条语句,是一组有意义的二进制代码,一条指令通常分为操作码和地址码两部分
op的位数决定能设计出有多少条指令
- 定长指令
- 可变长的指令
比如最后一块决定是定点数还是浮点数乘法。
扩展地址码技术
指令需要经过译码器翻译成机器语言,如果每个指令的位数相同那么译码器的位数也相同,程序执行时间也相同,但是不同的指令出现的频率也不相同,如果每个指令出现的频率都相同显然对于计算机来说是不划算的,比如加法减法要比乘法除法更常用,类似于哈弗曼树的思想,我们将经常使用的指令设计比较短的格式比较长的指令用于不经常使用的指令。
解释如果一个指令是16位,一个地址占4位,那么两个三个四个地址分别占8 12 16个地址,比如三个操作数12位,那么前四位会作为操作码来使用,但是机器不会自动区分地址码和操作码,所以必须保留一个1111作为是几地址的操作指令,所以最多只能表示16-1=15条指令。
地址码
- 取指令A4 取A1 取A2 存A3 现代计算机如果用PC代替A4那么地址码就会减少一个
- 取指令 取A1 取A2 把结果保存在A3
- 取指令 取两个操作数 保存结果但是如果操作结果保存在ACC累加寄存器 就可以减少一次访存过程
- 取指令 取A1操作数 其他不需要访存 一共访问两次主存
指令字长
- 定长:一般和存储器的位数相等
- 变长:一般是字节的整数倍。
小结
当用一些硬件资源代替指令码种地址码的字段之后
- 可以扩大寻址范围
- 可以缩短指令的字长 地址码的位数减少直接导致指令字长减少
- 可以减少访存次数 不用访问存储器了
当指令的地址字段为寄存器时 都设计成寄存器就不用访问存储器了
AX:计数器
BX:基址寄存器
CX:计数器
DX:数据寄存器
操作数类型和种类
操作数类型和在计算机中的存储方式
数据在存取的时候一般按照整数边界的方式来存取,整数边界在存取单字或者双字的时候可以减少访存的次数。
顺带复习一下 指令和数据在计算机中的地位是相等的。
数据传送
回想一下 我们实验三做实验的过程,数据是怎么传送的。
- MOVE :寄存器 寄存器
- STORE MOVE PUSH :寄存器 存储器
- LOAD MOVE POP: 寄存器 寄存器
- MOVE :存储器 存储器
算数逻辑
移位操作
转移跳转
调用和返回
下图演示的是主程序调用子程序的例子,主程序发出CALL SUB1(形式地址),具体子程序放在哪不是由用户来决定的而是由操作系统来决定的,操作系统把名字转换成地址,也可以通过嵌套形式地址,需要硬件提供断点。
陷阱和陷阱指令
输入输出
数据可以存放在寄存器中也可以存放在存储器中,如果在寄存器中必须要有寄存器号,如果是存储器要有存储器的地址。
寻址方式
立即寻址
- 指令执行阶段不访存
- A的位数限制了立即数的范围。
- MOV AX 3
直接寻址
指令字中的形式地址A就是操作数的真实地址EA
- 执行阶段只访问一次存储器
- A的位数限制了指令的范围
- 操作数的地址不易修改
隐含寻址
操作数的地址隐含在操作码中
比如MUL BX 那么被乘数AX隐含在MUL中
间接寻址
- 隐含寻址
- 基址寻址
- 变址寻址
- 相对寻址
- 堆栈寻址