导图社区 第四章 指令系统
这是一个关于第四章 指令系统的思维导图,包含指令系统、指令的寻址方式、程序的机器级代码表示等。
编辑于2024-01-16 15:52:47第四章 指令系统
指令系统
指令系统
指令系统是指令集体系结构(ISA)中最核心的部分,ISA完整定义了软件和硬件之间的接口。
指令的基本格式
零地址指令
一地址指令
二地址指令
三地址指令
四地址指令
定长操作码指令格式
定长操作码对于简化计算机硬件设计,提高指令译码和识别速度很有利。
扩展操作码指令格式
指令的操作类型
数据传送
寄存器之间的传送(MOV)
内存单元读取数据到CPU寄存器(LOAD)
CPU寄存器写数据到内存单元(STORE)
算术和逻辑运算
加(ADD)、减(SUB)、比较(CMP)、乘(MUL)、除(DIV)、加1(INC)、减1(DEC)、与(AND)、或(OR)、取反(NOT)、异或(XOR)
移位操作
算术移位、逻辑移位、循环移位
程序控制指令
循环控制指令
LOOP L1。 该指令每执行一次,循环计数器 ECX 中的循环次数就减 1, 然后判断 ECX 是否为 0, 若不为 0 则程序转到 L1 处继续执行;否则结束循环, 执行 LOOP 指令的下一条指令。
转移指令
无条件转移
条件转移
用 JZ、JNZ 表示=、≠时转移,用 JGE/JAE、JG/JA、JLE/JBE、JL/JB 分别表示有/无符号数的≥、>、≤、<时转移。
子程序调用与返回指令
子程序调用指令
主程序中转子指令的下一条指令的地址称为断点, 断点是子程序返回主程序时的返回地址。
x86 中的 call 指令,MIPS 中的 jal 指令
返回指令
x86 中的 ret 指令,MIPS 中的 jr $ra 指令。
调用指令和转移指令的区别
转移指令在同一程序内转移,而转子指令在不同程序之间转移。
转移指令不需要返回原处, 而转子指令需要返回原处。
转子指令和返回指令通常是无条件的,而条件转移指令是需要条件的。
输入输出操作
当外部设备与主存采用统一编址模式时,不需要设置专用的 I/O 指令,可以使用访存指令直接访问外部设备。
堆栈操作指令
字符串处理指令
指令的寻址方式
指令寻址和数据寻址
指令寻址(寻找下一条将要执行的指令地址称为指令寻址)
顺序寻址
下条指令地址由 PC 加一形成,即下条指令地址的 EA=(PC)+“1”。 其中,“1”为当前指令所占存储单元个数。
跳跃寻址
绝对地址(由标记符直接得到)
相对地址(相对于当前指令地址的偏移量)
数据寻址(寻找本条指令的数据地址称为数据寻址)
常见的数据寻址方式
隐含寻址
立即(数)寻址
MOV EAX,2008H
直接寻址
MOV EAX,[2008H]
间接寻址
MOV EAX,@2008H; @ 为间接寻址标志
寄存器寻址
MOV EAX,ECX
寄存器间接寻址
MOV AL,[EBX]
相对寻址
EA=PC+1+D
基址寻址
采用专用寄存器:基址寄存器采用隐含寻址的方法,不需要在指令中显式地指出。指令中的形式地址字段给出参与基址寻址的偏移值。 采用通用寄存器:需要增加寄存器编号字段指出使用的基址寄存器的编号。
变址寻址
MOV EAX,32[ESI] #将变址寄存器 ESI 的值加上偏移量 32 来形成地址访问主存,并将结果送到 EAX。
堆栈寻址
存储器堆栈
寄存器堆栈
程序的机器级代码表示
汇编指令格式
AT&T格式指令和Intel格式指令的对比
常用指令(Intel格式)
用于操作数的标记分别表示寄存器、内存和常数
<reg>:表示任意寄存器,若其后带有数字,则指定其位数
<mem>:表示内存地址
<con>:表示8位、16位或32位常数
数据传送指令
mov指令
push指令
pop指令
算术和逻辑运算指令
jmp指令
注意区分jmp(无条件跳转)和jcondition(条件跳转类指令)
jcondition指令
cmp/test指令
cmp和test指令通常和jcondition指令搭配使用
call/ret指令
常见的算数运算指令
常见的逻辑运算指令
过程调用的机器级表示
假定过程P(调用者)调用过程Q(被调用者),过程调用的执行步骤如下
1)P将入口参数(实参)放在Q能访问到的地方。
2)P将返回地址存到特定的地方,然后将控制转移到Q。 CALL指令
3)Q保存P的现场(通用寄存器的内容),并为自己的非静态局部变量分配空间。
4)执行过程Q。
5)Q恢复P的现场,将返回结果放到P能访问到的地方,并释放局部变量所占空间。
6)O取出返回地址,将控制转移到P。 RET指令
函数调用指令: call <函数名>
①将IP旧值压栈保存(保存在函数的栈帧顶部) ②设置IP新值,无条件转移至被调用函数的第一条指令
函数返回指令: ret
从函数的栈帧顶部找到 IP旧值(即返回地址),将其出栈并恢复IP寄存器
标记栈帧范围:EBP、ESP寄存器
ebp:指向当前栈帧的“底部”
esp:指向当前栈帧的“顶部”
对栈帧内数据的访问,都是基于 ebp、esp 进行的
如何访问栈帧?
函数调用时,如何切换栈帧?
在每个函数开头的“例行处理”
push ebp #保存上一层函数的栈帧基址(ebp旧值)
mov ebp,esp #设置当前函数的栈帧基址(ebp新值)
函数返回时,如何切换栈帧?
每个函数 ret 前的“例行处理”
注:每个栈帧底部,用于保存上一层栈帧的基址
mov esp, ebp #让esp指向当前栈帧的底部
pop ebp #将esp所指元素出栈,写入寄存器ebp
一个栈帧内可能包含哪些内容
选择语句的机器级表示
无条件转移指令
jmp<地址> #PC无条件转移至<地址> jmp 128 #<地址>可以用常数给出 jmp eax #<地址>可以来自于寄存器 jmp[999] #<地址>可以来自于主存 jmp NEXT #<地址>可以用“标号”锚定
cmp 指令的底层原理
本质上是进行 a-b 减法运算,并生成标志位OF、ZF、CF、SF
je<地址> #若a==b则跳转,ZF==1?
jne<地址> #若a!=b则跳转,ZF==0?
jg<地址> #若a>b则跳转、2F==0 && SF==OF ?
jge<地址> #若a>=b则跳转,SF==OF?
jl<地址> #若a<b则跳转,SF!=OF?
jle<地址> #若a<=b则跳转,SF!=OF||ZF==1?
循环语句的机器级表示
用条件转移指令实现循环
用loop指令实现循环
CISC和RISC的基本概念
复杂指令系统计算机(CISC)
主要特点
指令系统复杂庞大
指令的长度不固定,指令格式多,寻址方式多
可以访存的指令不受限制
各种指令使用频度相差很大
各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成
控制器大多数采用微程序控制
难以用优化编译生成高效的目标代码程序
大多能实现软件兼容,即高档机包含了低档机的全部指令,并可加以扩充
精简指令系统计算机(RISC)
主要特点
选取使用频率最高的一些简单指令,复杂指令的功能由简单指令的组合来实现
指令长度固定,指令格式种类少,寻址方式种类少
只有Load/Store(取数/存数)指令访存,其余指令的操作都在寄存器之间进行
CPU中通用寄存器的数量相当多
RISC一定采用指令流水线技术,大部分指令在一个时钟周期内完成
以硬布线控制为主,不用或少用微程序控制
特别重视编译优化工作,以减少程序执行时间
大多数RISC机不能与老机器兼容
CISC和RISC的比较