文章目录
-
- **一 指令系统**
- **二 指令的寻址方式**
- **三 程序的机器级代码表示**
-
- **1 常用汇编指令介绍**
- [**2 过程调用的机器级表示**](https://blog.csdn.net/m0_70403090/article/details/126802662?ops_request_misc=&request_id=46c636e7b68d40d484cacae27b85a353&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~koosearch~default-1-126802662-null-null.268^v1^control&utm_term=%E6%A0%88&spm=1018.2226.3001.4450)
- **3 选择语句的机器级表示**
- **4 循环语句的机器级表示**
- **四 CISC和RISC的基本概念**
一 指令系统
什么是指令(机器指令)?
指令是指示计算机执行某种操作的命令,例如add进行加操作,以及其他加减乘除和逻辑运算等。一台计算机的所有指令的集合构成该计算机的的指令系统(指令集)。
1 指令的基本格式
指令就是一组二进制代码,指令 = 操作码字段 + 地址码字段
操作码:识别指令,了解指令功能,区分操作数地址内容的组成和使用方法
地址码:给出被操作数的信息的地址
指令的长度与机器字长没有关系,可以等于也可以不等,例如单字长,半字长,双字长指令(都是字节的整数倍)
一个指令系统中,所有指令长度一样为定长指令字结构;指令长度随功能而异称为变长指令字结构
取指令是一次访存,按地址取数也是一次访存,放回运算结果也是一次访存
1.1 零地址指令
只给出操作码OP,没有显式地址
(1)不需要操作数,如空操作,停机操作,关中断指令等
(2)仅用在堆栈计算机中。另个操作数隐含的从栈顶和次栈顶弹出,送到运算器运算再隐含的压回栈顶
1.2 一地址指令
(1)只有目的操作数的单操作数指令,按A1地址取数完成操作后存回原地址,OP(A1)—>A1,比如加1,减1;三次访存
(2)隐含约定目的地址的双操作数指令,按A1取数,另一个隐含在ACC累加器中,运算结果也放在ACC中,(ACC)OP(A1)—>ACC;2次访存
1.3 二地址指令
(A1)OP(A2)—>A1,分别给出目的操作数地址和源操作数地址,目的地址还保留本次运算结果;四次访存
1.4 三地址指令
(A1)OP(A2)—>A3;四次访存
1.5 四地址指令
(A1)OP(A2)—>A3,A4是下一条要执行的指令的地址,即执行指令后,PC修改为A4所指地址;四次访存
2 定长操作码指令格式
指令字的最高位取n位固定的长度表示指令,有2n种指令,简化硬件设计,指令译码和识别速度快
3 扩展操作码指令格式
在定长指令长度的前提下采用可变长度操作码丰富指令种类,但增加了译码难度,控制器设计更复杂
常见方法是扩展操作码,但是扩展的方法会有所变动,例如取不同的一地址,二地址,三地址的指令条数
(1)短码不能是长码的前缀,比如
1111 0000
1111 1000
此时重叠,导致冲突
(2)各指令的操作码一定不能重复
一般情况常把使用频率高的指令分配较短的操作码,减少指令译码和分析时间
4 指令的操作类型
(1)数据传送
寄存器之间或者CPU,内存等
(2)算术和逻辑运算
ADD,SUB,CMP,MUL,DIV,INC,DEC,AND,OR,NOT,XOR等
(3)移位操作
(4)转移操作
无条件转移,条件转移,调用,返回,陷阱等
(2)输入输出操作
二 指令的寻址方式
是指寻找指令或操作数有效地址的方式,常分为指令寻址和数据寻址两大类
指令的地址码不是真实地址的称为形式地址(A),操作数的真实地址称为有效地址(EA)
1 指令寻址和数据寻址
1.1 指令寻址
寻找下一条将要执行的指令地址
(1)顺序寻址
程序计数器PC自动加1(一个指令字长),自动形成下一条指令的地址
(2)跳跃寻址
通过转移类指令实现,例如四地址中的A4,但是是否跳跃瘦状态寄存器和操作数的控制
绝对地址:标记符直接得到
相对地址:当前指令地址的偏移量
跳跃的结果是修改PC的值
1.2 数据寻址
是指如何在指令中表示一个操作数的地址,如何用这种表示得到操作数
2 常见的数据寻址方式
2.1 隐含寻址
不明显给出操作数的地址,例如零地址或者一地址的指令格式,隐含操作数在ACC或者堆栈中
缩短了指令字长,但是需要增加操作数或隐含地址的硬件
2.2 立即(数)寻址
地址段指出的不是操作数的地址,而是操作数本身(立即数),补码表示
不用访存,指令执行时间短,但是位数限制了立即数的范围
2.3 直接寻址
指令中的形式地址A就是操作数的真实地址EA,EA=A
寻址简单,一次访存,但A的位数决定了寻址范围,不易修改
2.4 间接寻址
指令的地址段给出的形式地址不是真实的地址,而是真实地址所在的存储单元的地址,EA=(A),可以是一次间接,也可以是多次
如图所示,主存第一位是1,表示不是真实地址,还需要查找,直到第一位是0
可寻址范围大,便于编程;但需要多次访存,速度慢
2.5 寄存器寻址
指令中直接给出寄存器编号,EA=Ri,操作数在寄存器中
不访存,执行速度快,支持向量矩阵运算;但是贵,数量有限
2.6 寄存器间接寻址
RI中不是操作数,而是真实地址的地址,EA=(Ri)
比一般间接寻址更快,需要访存
2.7 相对寻址
把PC中的内容加上指令格式中形式地址A形成真实地址,EA=(PC)+A,A就相当于PC的偏移量,可正可负,补码表示
A的位数决定寻址范围
操作数地址不固定,随PC值改变,便于程序浮动(一段代码在程序中浮动);常用于转移指令
取出转移指令后PC的值会自增,比如指令字长2B,以字节编址,那么PC+2,真实地址就是PC+2+A
2.8 基址寻址
将CPU中基址寄存器BR(面向操作系统)的内容加上形式地址A形成真实地址,EA=(BR)+A,BR可以是专用的也可以是通用寄存器
程序执行时,BR的内容不变,A会变动
寻址范围大,用户不用考虑程序在内存的位置,有利于多道程序设计,编址浮动程序(在内存中浮动),但A的位数较短
2.9 变址寻址
形式地址A加上变址寄存器IX(面向用户)的内容为真实地址,EA=(IX)+A,IX可以是专用的也可以是通用寄存器
A不变,IX的内容(偏移量)可以用户进行改变
寻址范围大,且适合编制循环程序(例如循环访问数组),for(i=0,;i<n;i++)中的i就相当于IX
2.10 堆栈寻址
堆栈是存储器(或寄存器组)中一块特定的后进先出的存储区
这个区域的读写单元的地址是特定的寄存器给出,称为堆栈指针SP
(1)硬堆栈(寄存器),成本高
(2)软堆栈,从内存中取一部分
常是无操作数指令的形式,读写后SP自动完成增减
复合寻址 ,EA = (IX )+((BR)+A)
三 程序的机器级代码表示
基于X86处理器
1 常用汇编指令介绍
使用不同编程工具开发程序,用到的汇编程序也不用,汇编格式也不同,一般有AT&T,Intel格式
AT&T | Intel |
---|---|
只能小写 | 不敏感 |
源—>目的 | 目的<—源 |
寄存器前加%,立即数前加$ | 无 |
寻址符号() | 寻址符号【】 |
复杂寻址“disp(base,index,scale)”,表示偏移量,基址,变址和比例因子,base+index*scale+disp | 直接就是base+index*scale+disp |
b字节,w字,l双字 | byte ptr,word ptr,dword ptr |
汇编指令常分为数据产生,逻辑计算,控制流
常用指令
(1)mov
第二个操作数复制到第一个;不能从内存到内存
(2)push
将操作数压入内存的栈
ESP是栈顶,压入前ESP减4(栈增长方向和内存地址方向相反),然后把数压入ESP所指地址
(3)pop
出栈,先把内容出栈,然后增加4
(4)add/sub
add相加,把结果保存到第一个数;sub相减,把结果保存到第一个数
(5)inc/dec
把操作数自增1,自减1
(6)imul
带符号整数乘法指令;两个操作数放入第一个操作数时必须是寄存器;三个操作数放入第一个操作数时必须是寄存器
(7)idiv
带符号整数除法指令,只有一个操作数,即除数,被除数在寄存器edx:eax(64位)中,商送到eax,余数送到edx
(8)and/or/xor
逻辑与,逻辑或,逻辑异或
(9)not 位翻转
(10)neg 取负指令
(11)shl/shr
逻辑左移,逻辑右移,第一个操作数表示被操作数,第二个表示移位的位数
(12)jmp
控制ip到label所指示的地址
(13)jcondition
条件转移指令,根据CPU状态字中的条件状态转移
(14)cmp/test
比较/逐位与运算,都不保存结果,根据结果设置CPU状态字的条件码
(15)call/ret
子程序的调用和返回。
call保存当前指令地址,然后转移,ret返回,然后弹出保存的指令地址无条件转移
2 过程调用的机器级表示
就是函数调用时各类数据的流动和栈的调用与返回
3 选择语句的机器级表示
常见的有if-then,if-then-else,case(swith)等
通过条件码设置指令和各类转移指令来实现
(1)条件码/标志码
CF进位,ZF零标志,SF符号,OF溢出
(2)if语句
4 循环语句的机器级表示
(1)do-while
(2)while
(3)for
四 CISC和RISC的基本概念
指令系统发展方向:
(1)增强原有指令功能,形成更复杂的复杂指令系统计算机(CISC)
(2)减少指令种类和简化功能,提高速度,精简类指令系统计算机(RISC)
1 CISC
复杂庞大,指令数目200以上
指令长度不固定,格式多,寻址方式多
可以访存的指令不受限制
不同指令使用频度相差大,有的使用很多,有的使用很少,且执行时间相差大
控制器采用微程序控制,难以用优化编译生成高效程序
不够合理
2 RISC
要求指令系统简化,尽量使用寄存器-寄存器操作指令
用简单指令来实现复杂指令
指令长度固定,格式种类少,寻址方式少
只有load/store指令访存,其余指令的操作都在寄存器之间进行
通用寄存器很多,一定采用流水线技术,大部分指令在一个时钟周期完成
重视编译优化,减少程序执行时间
RISC更能利用VLSI芯片的面积,更能提高运算速度,便于设计,减低成本,提高可靠性,有利于编译程序代码优化
但早期多是CISC,所有CISC的兼容性更好