目前正在备考25考研,现将25计算机408学习整理的知识点进行汇总整理。
一、指令系统
1.1指令的定义
指令就是计算机要执行某种操作的命令。一台计算机中所有机器指令的集合就是这台计算机的指令系统也称指令集。
指令系统的引入是为了避免用户与二进制代码直接触。
一般来说PC中的都是X86架构,而手机则是基于ARM架构指令集
1.2指令格式
包含:操作码(用户干什么)、地址码(对谁进行操作,根据干什么来设置指定数量的操作对象)
操作码(OP) | 地址码 |
1.3指令—按照地址码数量分类
1.零地址指令
指令格式:
操作码(OP) |
零地址指令(op):只要给出操作码即可,一般分为两种:
- 不需要操作数的操作如空操作、停机、关中断。
- 针对于堆栈计算机,这类指令并不是说不需要操作数,而是说操作数隐含在栈顶和次栈顶中,计算结果则压回栈顶。[例如:数据结构中的"后缀表达式",由中缀表达式转后缀表达式]
1.一地址指令
指令格式:
操作码(OP) | 一地址A1 |
包含两种情况:
- 只需要1个操作数,例如加1,减1,取反,求补等
- 需要2个操作数,其中一个操作数隐含在某个寄存器里(如隐含在ACC)
关于第一种情况:OP(A1)->A1
解释:首先从A1的主存单元中取出数据,接着对这个数据进行OP操作符操作,求得运算结果后再将运算结果放回A1所指向的主存单元。
执行该条指令需要三次访存:取读->读A1->写A1。【首先取读指的是从主存当中取出这个一地址指令,第二次访存根据A1所指的内容取读出A1所指的主存单元,第三次访存则是得到运算结果之后再将运算结果写回A1】
关于第二种情况:(ACC)OP(A1)->ACC
解释:将存放在ACC累加器中的数据以及A1地址中的数据读出来对两个数据进行OP操作,最终将运算的结果放入到ACC中。
执行该条指令需要两次访存:取指->读A1。【首先取读是从主存中取出指令,接着去A1地址中读出数据。注意对于从ACC累加器中读和写都不需要进行访存】
2.二地址指令
指令格式:
操作码(OP) | 目的操作数(A1) | 源操作数(A2) |
二地址指令:经常用于两个操作数算数运算、逻辑运算。
指令含义:(A1)OP(A2)->A1。
解释:将A1地址、A2地址中的数据取出进行运算后存回A1。
执行该条指令需要四次访存:取指->读A1->读A2->写A1。
4.三地址指令
指令格式:
操作码(OP) | A1 | A2 | A3(存放结果) |
三地址指令:同样也是两个操作数运算,但结果存放于新位置。
指令含义:(A1)OP(A2)->A3。
解释:将A1地址、A2地址中的数据取出进行运算后存回A3。
执行该条指令需要四次访存:取指->读A1->读A2->写A1。
4.四地址指令
四地址指令:实际上是在三地址指令的基础上新增了一个地址,该地址主要用于指向下一条要执行的指令地址
指令含义:(A1)OP(A2)->A3,A4=下一条指令执行地址。
解释:将A1地址、A2地址中的数据取出进行运算后存回A3,执行完指令后,将PC的值修改为A4所指的地址。
执行该条指令需要四次访存:取指令->读A1->读A2->写A1。
额外:在四地址中才会去修改PC指向的地址,一般正常指令执行完后则会PC+'1',指向下一条地址。
n位地址码的直接寻址范围=2^n
若是指令总长度固定不变,那么地址码的数量越多,寻址能力越差。(由于总长度固定不变,而地址码数量变多,那么地址码本身一条的长度范围就会越小,那么寻址能力就会越差)
1.4指令-按照指令长度分类
指令字长是指一条指令所包含的二进制代码位数,包含单字长指令(指令长度=机器字长),半字长指令(指令长度=半个机器字长),双字长指令(指令长度=两个个机器字长)。
注意:指令长度不同可能导致存取周期不同
指令字长(固定不变)、机器字长(可能发生改变)、存储字长(可能发生改变)
例如:机器字长=存储字=16bit,取一条双字长的指令则需要两次访存。
指令系统中不同策略:定长指令字结构、变长指令字结构。
定长指令字结构 :指令系统中所有指令的长度都相等
变长指令字结构 :指令系统中各种指令的长度不等
注意:主存一般是按字节编址的,指令字长通常为字节的整数倍。
1.5指令-按照操作码长度分类
定长操作码:指令系统中所有指令的操作码长度都相同。
控制器的译码电路设计简单,但是灵活性较低。
可变长操作码:指令系统中各指令的操作码长度可变。
控制器的译码电路设计复杂,但是灵活性较高。
之后可以学习一种扩展操作码指令格式
定长指令字结构+可变长操作码:指令的总长度不变,但是操作码位数可以改变的。
设计扩展操作码指令格式注意点如下:
1,不允许短码是长码的前缀。
举例:三地址指令的操作码为4位,二地址指令的操作码为8位,其中三地址指令的4位相对于二地址指令的8位就是短码对长码,那么短码不允许为长码的前缀。这也是用来区分三、二地址指令格式的一个要点。
2,各指令的操作码一定不能重复。
通常情况,对于频率高的指令通常分配越短的代码,频率低的分配更长代码。
另外一种扩展操作码设计:
设计思路:设置地址长度为n,上一层留出m种状态,下一层可扩展m*2n种状态。每一层使用上层留下来的状态+4位来进行确定对应的x位地址指令有几个。
接下来我们进行设计不同数量的地址指令:
①15条三地址指令:0000 xxxx xxxx xxxx - 1110 xxxx xxxx xxxx 实际开始结束就是0000 - 1110
预留为16-15=1,也就是预留了1位。
②12条二地址指令:1111 0000 xxxx xxxx - 1111 1011 xxxx xxxx 实际开始结束就是0000-1011
总条数包含有:1 * 2^4 = 16
预留为:16 - 12 = 4
③62条一地址指令:1111 1100 0000 xxxx - 1111 1111 1101 xxxx 实际开始结束就是000000 - 111101
总条数包含有:4 * 2^4 = 64
预留为:64 - 62 = 2
④32条零地址指令:1111 1111 1110 0000 - 1111 1111 1111 1111 实际开始结束就是 0 0000 - 1 1111
总条数包含有:2 * 2^4 = 32
预留为:32 - 32 = 0
例题:
1.6指令-按照操作类型分类
主要包含数据传送类、运算类(算数逻辑操作、移位操作)、程序控制类、输入输出类。
1、数据传送类
cup于主存之间的数据传送如:MOV,LOAD,STORE,PUSH,POP
2、运算类
算术逻辑运算,移位操作。
3、程序控制类:
改变程序执行流。
转移指令:无条件转移(JMP)、条件转移(BRANCH)、调用(CALL)和返回(RET)、陷阱指令(TRAP)
无条件转移:任何条件下转移
条件转移:特定条件下转移。转移条件一般为某个或多个标志位的值
调用指令和转移指令区别:程序调用必须保存下一条指令的地址,当子程序结束,根据返回地址返回主程序继续执行;而转移指令则不返回执行。
4、输入与输出类
CPU与IO设备之间数据交互。
1.7指令集体系结构
指令系统是指令集体系结构也称ISA中最核心的部分。指令集体系结构完整的定义了软件与硬件之间的接口(用这个来记忆ISA的内容),定义了计算机系统中的指令集合以及这些指令的操作方式。
ISA规定的内容:
- 指令格式,指令寻址方式,操作类型,以及每种操作对应的操作数的相应规定。
- 操作数的类型,操作数寻址方式,以及是按大端方式还是按小端方式存放。
- 程序可访问的寄存器编号、个数和位数,存储空间的大小和编址方式。
- 指令执行过程的控制方式等,包括程序计数器、条件码定义等。
二、指令的寻址方式
2.1指令寻址
寻址方式表示寻找指令或操作数的有效地址的方式,即确定本条指令的数据地址及下一条指令的待执行指令的地址的方法。 程序计数器来记录下一条指令的存放地址,其实质就是对于指令对于PC的不同的取值方式。
程序计数器(PC)位数->地址位数->存储器的字数
指令寄存器位数->指令的字长
采用不同寻址方式的目的:缩短指令字长(隐含,寄存器),扩大寻址空间(间接,基址,变址),提高编程的灵活性(支持不同的数据结构)。
2.1.1顺序寻址
程序计数器来记录下一条指令的存放地址。默认都是来对PC计数器来进行+1,正常都是顺序进行的。
①系统采用定长指令字结构,若是主存按照字编址,指令字长为2B,则是PC+1,按照顺序来进行往下执行。一般来说这里的"1"指的是指令字长。
②系统采用定长指令字结构,若是主存按照字节编址,指令字长为2B,则是PC+2,依旧是按照顺序向下执行,此时是每两个单元了。
③系统采用变长指令字结构,主存按照字节编址,指令字长为2B,此时流程:读入一个字,根据操作码判断这条指令的总字节数n,最终修改PC的值,此时为PC+n。
注意:根据指令的类型,CPU可能还需要进行多次访存,每次读入一个字。
2.1.2跳跃寻址
跳跃寻址:通过本条转移指令算出下一条指令地址,可能跳跃到绝对地址(根据标记符),也可能跳跃到相对地址(距当前的指令偏移量),算出后修改程序计数器PC。
注意:CPU总是根据PC的内容区主存取指令。
2.2、数据寻址
EA:Effective address
对于数据地址中读取的指令中的地址码,并不能够直接像上面的跳转寻址一样直接令PC=地址码,而是需要根据不同的指令来进行修改PC的值,修改方式有多种。
指令格式:
操作码 | 寻址特征 | 形式地址A |
注意:A既可以是寄存器的编号,也可以是内存的地址,(A)表示A地址所指向的内容。
2.2数据寻址基本的寻址方式
1.直接寻址
指令字中的形式地址A就是操作数的真实地址EA,即EA=A。
一条指令的执行:取指令访存1次,执行指令访存1次,暂不考虑存结果,共访存2次。
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。
缺点:A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改。
2.间接寻址
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是指向操作数地址的地址,即EA=(A)。
优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数),便于编制程序(用间接寻址可以方便地完成子程序返回)。
缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储字的最高位确定几次访存)。
3.寄存器寻址
在指令字中直接给出操作数所在的寄存器编号,即EA =Ri,其操作数在由Ri所指的寄存器内。
一条指令的执行:取指令访存1次,执行指令访存0次,暂不考虑存结果,共访存1次。
优点:指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快,支持向量/矩阵运算。(注意:访问寄存器不需要访问主存)
缺点:寄存器价格昂贵,计算机中寄存器个数有限。
4.寄存器间接寻址
寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(Ri)。
一条指令的执行:取指令访存1次,执行指令访存1次,暂不考虑存结果,共访存2次。
特点:与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。
5.隐含寻址
不是明显给出操作数的地址,而是在指令中隐含着操作数的地址。
例如,单地址的指令格式就隐含约定第二个操作数由累加器(ACC)提供。
优点:有利于缩短指令字长,简化地址结构。
缺点:需增加存储操作数或隐含地址的硬件。
6.立即寻址
形式地址A就是操作数本身,又称为立即数,一般采用补码形式。#表示立即寻址特征。
一条指令的执行:取指令访存1次,执行指令访存0次,暂不考虑存结果,共访存1次。
优点:指令执行阶段不访问主存,指令执行时间最短。
缺点:A的位数限制了立即数的范围,如A的位数为n,且立即数采用补码时,可表示的数据范围为− 2 ^(n−1) ∼ 2 ^(n−1) - 1 。
7.偏移寻址
三种偏移寻址的区别在于偏移的”起点“不一样。寻找到的是操作数的有效地址!!
基址寻址
以程序的起始存放地址作为“起点”,将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A。
拓展:程序运行前,CPU将BR的值修改为该程序的起始地址(存在操作系统PCB中)。
注:基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量);当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。
优点:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序(整个程序在内存里边的浮动),方便实现多道程序并发运行。
变址寻址
程序员自己决定从哪里作为“起点”,有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,即EA= (IX)+A,其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器。
注:变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(作为基地址),这是基址寻址与变址寻址的区别。
优点:扩大寻址范围。在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。偏移量的位数足以表示整个存储空间。
基址&变址复合寻址
先基址后变址寻址:EA=(IX)+(BR)+A
多种寻址方式复合使用,可理解为复合函数。
相对寻址
以程序计数器PC所指地址作为“起点“,把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示。(注意:先自增在加偏移量)
A的位数决定了操作数的寻址范围。
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动)。相对寻址广泛应用于转移指令。
8.堆栈寻址
操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址。
堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出(LIFO)”原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。
注:寄存器堆栈也称硬堆栈,硬堆栈的成本较高,不适合做大容量的堆栈,不需要访存。而从主存中划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈,需要访存。
回顾:
寻址方式 | 有效地址 | 访存次数(指令执行期间) |
隐含寻址 | 程序指定 | 0 |
立即寻址 | A即是操作数 | 0 |
直接寻址 | EA=A | 1 |
一次间接寻址 | EA=(A) | 2 |
寄存器寻址 | EA=Ri | 0 |
寄存器间接一次寻址 | EA=(Ri) | 1 |
相对寻址 | EA=(PC)+A | 1 |
基址寻址 | EA=(BR)+A | 1 |
变址寻址 | EA=(IX)+A | 1 |
堆栈寻址 | 入栈/出栈时EA确定方式不同 | 硬堆栈不访存,软堆栈访存1次 |
三、程序的机器级代码表示
3.1高级语言与机器级代码之间的对应
探讨指令中地址码数据在哪儿?
高级语言->汇编语言->机器语言
一条高级语言可能会转为多条汇编语言,一条汇编语言对应翻译一条机器语言(一一对应)
其中汇编语言、机器语言统称为机器级代码。
注意:对于汇编语言会详细注释版本,若是没有注释默认就是x86汇编语言。
主要掌握x86汇编语言指令基础即可。
指令由操作码与地址码组成,操作码表示怎么处理?地址码则是表示的是数据在哪里。
对mov指令进行举例:
语法格式:mov 目的操作数d, 源操作数s
1、mov eax, ebx:将寄存器ebx的值复制到寄存器eax中。
2、mov eax, 5:将立即数5复制到寄存器eax中。
3、mov eax, dword ptr [af996h]:将内存地址af996h所指的32bit值复制到寄存器eax中。
4、mov byte ptr [af996h], 5:将立即数5复制到内存地址af996h所指的一字节中。
对于 [xxx]前的含义如下:
dword ptr:双字,32bit
word ptr:单字,16bit
byte ptr:字节,8bit
x86架构CPU的一些寄存器:
下面是三个部分寄存器:
①如EAX、EBX、ECX、EDX寄存器:
说明:以E开头的为寄存器,对于E.X,最后的X表示的是未知
- mov eax, ebx:寄存器->寄存器,寄存器寻址。
- mov eax, dword ptr [af996h]:主存->寄存器,直接寻址+基址寻址的组合方式。
- mov eax, 5:立即数->寄存器。
②如ESI、EDI
说明:结尾为I的为index表示为变址寄存器,其中S是Source,D是Destination。
应用:通常变址寄存器用来表示线性表、字符串的处理。
③如EBP、ESP
说明:BP表示的是Base Pointer堆栈基指针,SP表示的是Stack Pointer堆栈顶指针。
应用:堆栈寄存器用于实现函数调用。
- 对于所有E开头的默认都是32bit,对于通用寄存器我们可以使用更加灵活一些,可以将E扩展部分去掉,剩余AX、BX、CX、DX用来表示低16位,此时就只有16位。
- 对于AX、BX、CX、DX还可以使用的更加灵活,可拆分为AX(AH、AL)、BX(BH、BL)、CX(CH、CL)、DX(DH、DL)每一个部分表示8bit。.
拆分完之后,可以将原先的命令修改为:mov ah, bl、mov ah, byte ptr [af996h]、mov ah, 5。
小总结:对于通用寄存器我们可以使用16bit,也可以使用8bit,还可以使用32bit。
对于变址寄存器以及堆栈指针则都是32位,不能够像通用寄存器一样只能固定使用32bit。
更多例子:列举一条 mov eax, dword ptr[ebx],这里是将ebx所指主存地址的32bit复制到eax寄存器中,这里与之前列举的不一样这里的是寄存器间接寻址。其他更多情况如下图:
额外例子:针对于[ebx+8]指的是ebx寄存器偏移8个单位来找到该数据
3.2常用的X86汇编语言指令格式
包含各类的算数运算、逻辑运算以及其他。
3.2.1常见的算数运算指令
在算数运算指令中,目的操作数d不可以是常量,只可能是寄存器、主存地址,而对于source则可以任意取,可以是常数也可以是来自于寄存器、主存等。
常见的算数运算指令如下:
额外对于上面指令着重解释的有除法,对于除法divide,可以看到只有一个操作数,该操作数表示的是除数,而对于被除数则是放在edx:eax(edx和eax两个寄存器中),商存入eax,余数存入edx。【实际这个被除数是隐含寻址】
edx:eax写法:在进行除法运算之前需要把被除数位扩展,例如32b/32b,需要将被除数这个32bit扩展为64位,也就是用64bit的被除数除以32bit的除数。由于寄存器默认是32bit,那么我们也说了需要32bit扩展为64bit的被除数,此时就需要两个寄存器,更高位放在edx,更低位放在eax,并且最终商会放在eax中,余数存放在edx中。
王道书对于指令示例解释
王道书解释:两个操作数,后面的放到前面中,对于左边的数不能够是常量,右边的可以是常量或者从内存、寄存器中取出的。
- <reg>:表示的是register,这个操作数可以是寄存器里的操作数。
- <mem>:memery内存。
- <con>:constant常数。
注意:在x86中指令不能两个数都是来自于主存,要么同时来自于寄存器,要么一个来自于寄存器,一个来自于主存,这个规则目的就是不要太多次访问主存,访问主存次数越多,越慢。不能主存——主存。
3.2.2、常见的逻辑运算指令
常见的逻辑运算指令:与、或、非、异或、左移、右移。
对于两个操作数的,最终的结果放在第一个操作数中。
若是一个操作数的,最终的结果依旧是放在该操作数中。
控制单元CU会依次执行并解析这些指令,当确定运算指令后(如add、or…)CU会给ALU算数逻辑运算单元发送与这条指令相对应的控制信号来进行相应操作,对应的d、s会相应的送到对应d、s端,最终结果从输出端输出。
3.3AT&T格式和Intel格式
3.4选择语句机器级表示
3.4.1程序中的选择语句
在Intel X86处理器中,程序计数器PC(Program Counter)一般被称为IP(Instruction Pointer)
对于汇编语言遇到选择跳转时就需要跳转指令。
3.4.2无条件转移指令jmp
无条件转移指令:jmp,会让pc无条件的转移到<地址>
举例:
3.4.3条件转移指令jxxx
示例:
扩展:cmp指令的底层原理
3.5循环语句机器级别表示
3.5.1使用条件转移指令实现循环
for循环、while循环都可以实现同一个循环:
可以采用条件转移指令实现循环:
3.5.2使用loop指令实现循环
使用loop指令实现循环:对于直接循环n次我们可以考虑使用一个寄存器以及一个loop循环来进行实现:
注意:若是使用loop指令那么一定要搭配使用ecx。
使用loop指令的原因?使代码更加简洁。
补充:loopx指令,例如loopnz,loopz
- loopnz:也就是当ecx != 0 && ZF == 0,继续循环。其中nz表示not zero。
- loopz:就是当ecx != 0 && ZF == 1,继续循环。z表示为zero。
3.6过程(或称函数)调用的机器及表示
过程P(调用者),过程Q(被调用者)过程调用步骤 :
- P将入口参数(实参)放到Q能访问到的地方;
- P保存返回地址,然后将控制转移到Q;
- Q保存P的现场,并为自己的非静态局部变量分配空间;
- 执行Q的过程体(函数体);
- Q恢复P的现场,释放局部变量空间;
- Q取出返回地址,将控制转移到P。
3.6.1函数的调用于返回
对于当前正在执行的函数栈帧,位于栈顶。
在汇编语言中,使用了call、ret两条指令来表示调用与返回
3.6.2函数的访问
1.栈帧的访问
使用Push和Pop进行入栈和出栈。
2.栈帧的切换
相当于如何此函数结束之后返回到哪
总结一个栈帧中包含哪些数据:!!!!!!!!!
函数调用的机器表达:!!!!!!!!!!!!!!!!
第3小结总结:
四、CISC与RISC
CISC与RISC是两种设计方向。
1.CISC
复杂指令集系统,一条指令完成一个复杂的基本功能。可类比是C语言+库函数。
CICS的主要特点:
- 指令系统复杂庞大,指令数目一般多达200~300条。
- 指令长度不固定,指令格式种类多,寻址方式种类多。
- 可以访存的指令不受限制(RISC只有取数/存数指令访问存储器)
- 各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。
- 控制器大多数采用微程序控制。
- 难以用优化编译生成高效的目标代码程序
代表:x86架构,用于笔记本、台式机等。
2.RISC
精简指令集系统,一条指令完成一个基本动作,多条指令组合完成一个复杂的基本功能。可类比C语言中只有基本的循环、判断语句。
RISC的主要特点:
- 选取使用频率较高的一些简单指令以及一些很有用但不复杂的指令,让复杂指令的功能由使用频率高的简单指令的组合来实现。
- 指令长度固定,指令格式种类少,寻址方式种类少。
- 只有取数/存数指令访问存储器,其余指令的操作都在寄存器内完成。
- CPU中有多个通用寄存器(比CICS的多)
- 采用流水线技术(RISC一定采用流水线),大部分指令在一个时钟周期内完成。采用超标量超流水线技术,可使每条指令的平均时间小于一个时钟周期。
-
控制器采用组合逻辑控制,不用微程序控制。
- 采用优化的编译程序
3.RISC与CICS的比较
- RISC比CICS更能提高计算机运算速度;RISC寄存器多,就可以减少访存次数,指令数和寻址方式少,因此指令译码较快。
- RISC比CISC更便于设计,可降低成本,提高可靠性。
- RISC能有效支持高级语言程序。
- CICS的指令系统比较丰富,有专用指令来完成特定的功能,因此处理特殊任务效率高。
代表:ARM架构,主要用于手机、平板等。
标签:寻址,指令系统,--,操作数,A1,地址,指令,寄存器,第四章 From: https://blog.csdn.net/qq_65880213/article/details/139703912