导图社区 计算机组成 第四章-指令系统
计算机组成 第四章-指令系统学习笔记,包括指令格式、指令的寻址方式、CISC和RISC的基本概念、程序的机器级代码表示等等。
编辑于2022-11-23 21:10:51 上海指令系统
指令格式
指令
指令(机器指令)是指示计算机执行某种操作的命令。一台计算机的所有指令的集合构成该机的指令系统,也称指令集。指令系统是计算机的主要属性,位于硬件和软件的交界面上
指令的基本格式
操作码:指出该指令应该执行什么性质的操作以及具有何种功能,是识别指令、了解指令功能及区分操作数地址内容的组成和使用方法的关键信息
地址码:给出被操作信息(指令或数据)的地址,包括参加运算的若干个操作数所在的地址、运算结果的保存地址、程序的转移地址、被调用的子程序的入口地址等
分类
零地址指令
1)不需要操作数的地址,如空操作指令、停机指令、关中断指令等
2)零地址的运算类指令仅用在堆栈计算机中。通常参与运算的两个操作数隐含地从栈顶和次栈顶弹出,送到运算器进行运算,运算结果再隐含地压入堆栈。
一地址指令
1)只有目的操作数的单操作数指令,按A1地址读取操作数,进行OP操作后,结果存回原地址。 指令含义:OP(A1)→A1 如操作码含义是加1、减1、求反、求补等。
2〉隐含约定目的地址的双操作数指令,按指令地址A可读取源操作数,指令可隐含约定另一个操作数由ACC(累加器)提供,运算结果也将存放在ACC中。 指令含义: (ACC)OP(A1))-ACC 若指令字长为32位,操作码占8位,1个地址码字段占24位,则指令操作数的直接寻址范围为2^24= 16M。
二地址指令
指令含义: (A1)OP(A2)→A1 对于常用的算术和逻辑运算指令,往往要求使用两个操作数,需分别给出目的操作数和源操作数的地址,其中目的操作数地址还用于保存本次的运算结果。
若指令字长为32位,操作码占8位,两个地址码字段各占12位,则指令操作数的直接寻址范围为2^12=4K。
三地址指令
指令含义: (A1)OP(A2)→A3
若指令字长为32位,操作码占8位,3个地址码字段各占8位,则指令操作数的直接寻址范围为= 256。若地址字段均为主存地址,则完成一条三地址需要4次访问存储器(取指令1次,取两个操作数2次,存放结果1次)。
四地址指令
指令含义: (A1)OP(A2)→A3,A4=下一条将要执行指令的地址。
若指令字长为32位,操作码占8位,4个地址码字段各占6位,则指令操作数的 直接寻址范围为2^6=64。
定长操作码指令格式
在指令字的最高位部分分配n位(定长)表示操作码,可最多表示2^n条指令
扩展操作码指令格式(可变长度操作码)
定义:操作码字段的位数不固定,且随着地址码的减少而增加
短码不能是长码的前缀,故4位操作码最多表示15条指令
指令的操作类型
数据传送
传送指令通常有寄存器之间的传送(MOV)、从内存单元读取数据到CPU寄存器(LOAD)、从CPU寄存器写数据到内存单元(STORE)等。
算术和逻辑运算
这类指令主要有加(ADD)、减(SUB)、比较(CMP)、乘(MUL)、除(DIV)、加1(INC)、减1(DEC)、与(AND)、或(OR)、取反(NOT)、异或(XOR)等。
移位操作
算术移位、逻辑移位、循环移位
转移操作
转移指令主要有无条件转移(JMP)、条件转移(BRANCH)、调用(CALL)、返回(RET)、陷阱(TRAP)等。
调用指令和转移指令的区别: 执行调用指令时必须保存下一条指令的地址(返回地址),当子程序执行结束时,根据返回地址返回到主程序继续执行;而转移指令则不返回执行
无条件转移指令在任何情况下都执行转移操作,而条件转移指令仅在特定条件满足时才执行转移操作,转移条件一般是某个标志位的值,或几个标志位的组合。
输入输出操作
完成CPU与外部设备交换数据或传送控制命令及状态信息
指令的寻址方式
定义:寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法,分别指令寻址和数据寻址
指令寻址(寻找一下条将要执行的指令地址)
顺序寻址
通过程序计数器PC加1(1个指令字长),自动形成下一条指令的地址
跳跃寻址
通过跳跃类指令实现;由本条指令计算下条指令地址,跳跃地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃结果是修改PC值,因此下条指令仍然通过PC给出
数据寻址(寻找本条指令的数据地址)

隐含寻址
定义
不明显给出操作数地址,而在指令中隐含操作数地址
例如单地址的指令格式,规定累加器(ACC)作为第二操作数地址,指令格式仅显式给出第一操作数的地址
优点
有利于缩短指令字长,可简化地址结构
缺点
需增加存储操作数或隐含地址的硬件
立即数寻址
定义
指令的地址字段直接给出操作数本身(补码表示)
#表示立即寻址特征
优点
不访问主存,执行时间最短
缺点
A的位数限制了立即数范围
直接寻址
定义
指令字中的形式地址A是操作数的真实地址EA,即EA=A
优点
实现简单,只需一次访存,不需要专门计算操作数地址
缺点
A的位数决定了寻址范围,且操作数地址不易修改
间接寻址
定义
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址(即操作数地址的地址),即EA=(A)
可以是一次间接寻址或多次间接寻址
优点
可扩大寻址范围(有效地址EA的位数>形式地址A的位数),便于编制程序(用间接寻址可方便地完成子程序返回)
缺点
指令在执行阶段要多次访存(因此不常用,使用寄存器间接寻址扩大寻址范围)
寄存器寻址
 
定义
在指令字中直接给出操作数所在的寄存器编号,即EA=R
优点
指令在执行阶段不访问主存,只访问寄存器,因寄存器数量较少,对应地址码长度较小,使得指令字短
不用访存,所以执行速度快,支持向量/矩阵运算
缺点
寄存器数量较少且价格昂贵
寄存器间接寻址
定义
在寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(Ri)
特点
比一般间接寻址速度更快,但指令的执行阶段需访问主存(因为操作数在主存中)
相对寻址
定义
把PC的内容加上指令格式的形式地址A而形成操作数的有效地址,即EA=(PC)+A
A是相对于当前指令地址的位移量,可正可负,补码表示
优点
操作数的地址不是固定的,随PC指变化,便于程序浮动,适用于转移指令(但寻址范围仍是由A的位数决定的)
基址寻址
 答:首先对形式地址进行符号扩展,以便于基址相加,补码表示的FFI2H为负数,故扩展时前面添1,变为FFFF FF12H,转为原码,变成-0000 00EEH,与基址寄存器内容相加后,变为EFFF FF12H,由大端存储可知,最低有效字节在机器数的末尾地址。而1234 FF00H按字节编址,需4个存储单位,故答案为EFFF FF12 + 3 =EFFF FF15H。 选D
定义
将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(BR)+A
基址寄存器既可采用专用寄存器,又可采用通用寄存器
特点
基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定,主要用于解决程序逻辑空间与存储器物理空间的无关性。在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统确定。
优点
可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);
用户不必考虑自己的程序存于主存的哪个空间区域,因此有利于多道程序设计,并可用于编制浮动程序,但偏移量(形式地址A)的位数较短。
变址寻址
 
定义
指有效地址EA等于指令字中的形式地址与变址寄存器IX的内容之和,即EA=(IX)+A
IX为变址寄存器(专用),也可用通用寄存器作为变址寄存器
特点

变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(作为偏移量),形式地址A不变(作为基地址)。
优点
可扩大寻址范围(变址寄存器的位数大于形式地址A的位数);在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序。偏移量(变址寄存器IX)的位数足以表示整个存储空间。
堆栈寻址
定义
堆栈是存储器(或专用寄存器组)中一块特定的、按后进先出(LIFO)原则管理的存储区,该存储区中读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。
硬堆栈
寄存器堆栈,成本较高,不适合做大容量的堆栈
软堆栈
从主存中划出一段区域来做堆栈
特点
在采用堆栈结构的计算机系统中,大部分指令表面上都表现为无操作数指令的形式,因为操作数地址都隐含使用了SP。通常情况下,在读/写堆栈中一个单元的前后都伴有自动完成对SP内容的增量或减量操作
CISC和RISC的基本概念
复杂指令系统计算机(CISC)
特点
1)指令系统复杂庞大,指令数目一般为200条以上。
2)指令的长度不固定,指令格式多,寻址方式多。
3)可以访存的指令不受限制。
4)各种指令使用频度相差很大。
5)各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。
6)控制器大多数采用微程序控制。有些指令非常复杂,以至于无法采用硬连线控制。
7)难以用优化编译生成高效的目标代码程序。
精简指令系统计算机(RISC)
特点
1)选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现。
2)指令长度固定,指令格式种类少,寻址方式种类少。
3)只有Load/Store(取数/存数)指令访存,其余指令的操作都在寄存器之间进行。
使取指取数的操作简化且时长固定,简化流水线设计
4)CPU中通用寄存器的数量相当多。
5)RISC一定采用指令流水线技术,大部分指令在一个时钟周期内完成。
6)以硬布线控制为主,不用或少用微程序控制。
7)特别重视编译优化工作,以减少程序执行时间。
CISC和RICS的比较
程序的机器级代码表示
常用汇编指令介绍
相关寄存器
x86处理器中有8个32位的通用寄存器。为了向后兼容EAX、EBX、ECX和EDX的高两位和低两位字节都可独立使用;E为Extended,表示32位的寄存器
汇编指令格式
分类
AT&T格式
Intel格式
区别
①AT&T格式的指令只能用小写字母,而Intel格式的指令对大小写不敏感。
②在AT&T格式中,第一个为源操作数,第二个为目的操作数,方向从左到右;在Intel格式中,第一个为目的操作数,第二个为源操作数,方向从右向左。
③在AT&T格式中,寄存器需要加前缀“%”,立即数需要加前缀“$“;在Intel格式中,寄存器和立即数都不需要加前缀。
④在内存寻址方面,AT&T格式使用“(”和“)”,而Intel格式使用“[”和“]”。
⑤在处理复杂寻址方式时,例如 AT&T格式的内存操作数“disp(base,index,scale)”分别表示偏移量、基址寄存器、变址寄存器和比例因子,如“8(%edx,%eax,2)”表示操作数为M[R[edx]+R[eax]*2+8],其对应的Intel格式的操作数为“[edx+eax*2+8]”。
⑥在指定数据长度方面,AT&T格式指令操作码的后面紧跟一个字符,表明操作数大小,“b”表示 byte(字节)、“w”表示 word(字)或“l”表示long(双字)。Intel格式也有类似的语法,它在操作码后面显式地注明byte ptr、word ptr或dword ptr。
常用指令(intel格式)
标记(表示寄存器、内存或常数)
<reg>: 表示任意寄存器,若其后带有数字,则指定其位数,如<reg32>表示32位寄存器(eax、ebx、ecx、edx、esi、edi、esp或ebp)<reg16>表示16位寄存器( ax、bx、cx或dx; <reg8>表示8位寄存器(ah、al、bh、bl、ch、cl、dh、dl)。
<mem>: 表示内存地址(如[eax]、[var+4]或dword ptr [eax+ebx])。
<con>: 表示8位、16位或32位常数。<con8>表示8位常数;<con16 >表示16位常数
数据传送指令
mov指令
功能
将第二个操作数(寄存器的内容、内存中的内容或常数值)复制到第一个操作数(寄存器或内存)。但不能用于直接从内存复制到内存
语法
push指令
功能
将操作数压入内存的栈,常用于函数调用。ESP是栈顶,压栈前先将ESP指减4(栈增长方向与内存地址增长方向相反),然后将操作数压入ESP指示的地址
语法
pop指令
功能
先将ESP指示的内容出栈,再将ESP值加4
语法
算数和逻辑运算指令
add/sub指令
功能
将两个操作数相加/减,结果保存到第一个操作数中;
语法
inc/dec指令
功能
将操作数自加1(自减1)
语法
imul指令
功能
带符号整数乘法指令,有两种格式: ①两个操作数,将两个操作数相乘,将结果保存在第一个操作数中,第一个操作数必须为寄存器;②三个操作数,将第二个和第三个操作数相乘,将结果保存在第一个操作数中,第一个操作数必须为寄存器。
语法
idiv指令
功能
带符号整数除法指令,只有一个操作数,即除数;被除数位edx:eax中的内容(64位整数),操作结果有两部分:商和余数,商送到eax,余数送到edx
语法
and/or/xor指令
功能
逻辑与、或、异或指令,用于操作数的位操作
语法
not指令
功能
位翻转指令,即0→1,1→0
语法
neg指令
功能
取负指令
语法
shl/shr指令
功能
逻辑移位指令。shl为逻辑左移,shr为逻辑右移;第一个操作数表示被操作数,第二个操作数表示移位的位数
语法
控制流指令

jmp指令
功能
控制IP转移到label所指示的地址(从label中取出指令执行)
语法
jcondition指令
功能
条件转移指令,依据CPU状态字中的一系列条件状态转移。CPU状态字中包括指示最后一个算数运算结果是否为0,运算结果是否为负数等
语法
cmp/test指令
功能
cmp指令用于比较两个操作数的值,test指令对两个操作数进行逐位与运算。这两类指令都不保存操作结果,仅根据运算结果设置CPU状态字中的条件码
语法
call/ret指令

功能
分别用于实现子程序(过程、函数等)的调用及返回
语法
过程调用的机器级表示(call/test)
执行步骤
假定过程P(调用者)调用过程Q(被调用者)
1) P将入口参数(实参)放在Q能访问到的地方。
2) P将返回地址存到特定的地方,然后将控制转移到Q。
通过call指令实现
3) Q保存P的现场(通用寄存器的内容),并为自己的非静态局部变量分配空间。
4) 执行过程Q。
5) Q恢复P的现场,将返回结果放到Р能访问到的地方,并释放局部变量所占空间。
6) Q取出返回地址,将控制转移到P。
通过ret指令实现
存储区域
寄存器
调用者保护寄存器
EAX
ECX
EDX
保护和恢复的任务由过程P负责,当P调用Q时,Q可以直接使用这三个寄存器
被调用者保护寄存器
EBX
ESI
EDI
Q必须先将它们的值保存在栈中才能使用它们,并在返回P之前恢复其值
栈
栈帧
栈的组成单元,每个过程都有自己的栈帧,用于保存入口参数、返回地址、过程P的现场、过程Q的局部变量、返回结果等
帧指针寄存器EBP
指示栈帧的起始位置(栈底)
栈指针寄存器ESP
指示栈顶,栈从高地址向低地址增长
举例程序
机器代码
栈帧过程分析
最初进入caller时,将EBP的值压入栈中
caller只是用了调用者保存寄存器EAX,没有使用任何被调用者保存寄存器,因而在caller栈帧中无须保存除EBP外的任何寄存器的值
caller有三个局部变量temp1、temp2和sum皆被分配在栈帧中
在call指令调用add函数之前,caller先将入口参数从右向左一次将temp2、temp1保存到栈中
在执行call指令时再把返回地址压入栈中
4+12+8+4=28(栈帧大小必须是16字节的倍数,故有4字节的空间被浪费
选择语句的机器级表示
条件码(标志位)
CPU维护一组条件码寄存器,描述了最近的算术或逻辑运算操作的属性
CF:进(借)位标志
最近无符号整数加(减)运算后的进(借)位情况。有进(借)位时,CF=1;否则CF=0;
针对无符号数
ZF:零标志
最近的操作的运算结果是否为0。若结果为0,ZF=1;否则ZF=0
SF:符号标志
最近的带符号数运算结果的符号。若为负,SF=1;否则SF=0
OF:溢出标志
最近的带符号数运算结果是否溢出。若溢出,OF=1;否则OF=0
针对带符号数
if语句
switch语句
编译转换过程
构造跳转表,并正确设置索引值
循环语句的机器级表示
do-while循环
通用形式
翻译为goto语句
while循环
通用形式
转换为do-while循环
翻译为goto语句
for循环
通用形式
翻译为goto语句