CO-4-指令系统
2021-08-06 15:20:57 0 举报
AI智能生成
计算机组成原理 第四章 指令系统 知识点梳理
作者其他创作
大纲/内容
指令寻址方式
问题:CPU如何知道下一条指令存在哪里?<br>
PC永远指向下一条指令的地址
寻址方式实际上就是确定PC的值的变化方式
顺序寻址
PC+"1"
此处的1理解为一个指令字长<br>
实际的增量会因指令格式、指令长度、<br>主存编址方式不同而发生变化<br>
取指阶段结束就会令PC+1
根据转移类指令给出下一个指令的地址
转移类指令执行就会改变PC的值
但是在取指之后,执行完之前,仍有PC+1的操作
数据寻址
问题:如何确定本条指令的地址码指<br>明的真实地址EA(EffectiveAddress)<br>
不同的程序不同时刻可能装入不同的主存位置<br>不能直接根据地址码访问对应的主存地址<br>
通过地址码的头几位,指明地址的“解读方式”
直接寻址:形式地址就是真实地址
取数据访存1次
无需计算操作数地址
寻址范围有限,受到指令字长限制
间接寻址:形式地址是真<br>实地址存储单元的地址<br>
取数据访存2次
ie ((A))=(A1)=真实地址<br>
一次间址、两次间址
寻址空间不受指令长度限制
(多次间址)便于编制程序,方便子程序返回
寄存器寻址:地址码给<br>出存储操作数的寄存器<br>
取数据访存0次
速度飞快,不访问主存
寄存器少,编号短,指令字短,寻址能力有限
支持向量、矩阵运算
寄存器间接寻址:地址码给<br>出存储操作数<font color="#F44336">地址</font>的寄存器
取数据访存1次
比一般间址快,但是访存,快不了多少
隐含寻址:指令中隐含<br>一个地址不显式给出<br>
取数据访存0次
默认某个操作数为ACC
需要增加一个硬件存储和指令对应的操作数
立即寻址:地址码就是操作数
笑死,根本不寻址,取数据不需要访存
操作数又称立即数,一般以补码表示,以#xxx表示立即数<br>一般也可以直接用#来标识立即寻址方式。<br>
立即数表示范围有限
偏移寻址(3):形式地址<br>是相对某地址的偏移量<br>访存1次<br>
基址寻址:以程序<br>起始点作为基点<br>EA=(BR)+A<br>
一般有专用的基址<br>寄存器BaseRegister<br>
或者用一个指令指明的<br>通用寄存器作为BR<br>
程序运行前,CPU将BR修改为其起始地<br>址,存放于OS的PCB(进程控制块)中<br>
BR可以由用户在汇编中指定,但不能对<br>其寄存的内容进行控制,只能交由OS。<br>
对于不知道要装入主存何位置的程序<br>可用基址寻址寻找程序内的任意位置<br>
方便程序在内存中的浮动
方便多道程序并行运行
变址寻址:程序员<br>决定以哪里为基点<br>EA=(IX)+A<br>
用变址寄存器Index-<br>Register作为基地址<br>
亦可指定一个通用寄存器作为IX
IX面向用户,可以手动修改其中的值
提高汇编代码循环体内指令的可复用性<br>提高访问数组的工作效率<br>
基址/变址复合寻址
EA=(IX)+((BR)+A)
相对寻址:以PC所<br>指地址作为基点<br>EA=(PC)+A<br>
在PC的值上加A形成地址<br>
A可正可负,<br>用补码表示<br>
要注意CPU取指后PC+1
故是相对于下一条指令为A的地址
便于代码在程序内的浮动
广泛用于转移指令
用于方便地在程序内进行跳转<br>同时不受程序存储位置的影响<br>
分段地址码<br>
实现了代码段数据段分离,修改<br>代码后无需频繁调整相对地址<br>
堆栈寻址:到栈顶和次栈顶<br>寻找操作数,算完放回去<br>
隐含使用堆栈指针SP(指向栈顶)
堆栈可能存在主存中(软堆栈)<br>也可能有专用堆栈寄存器组(硬堆栈)<br>
硬堆栈无需访存,软堆栈POP/PUSH各一次访存
执行过程<br>
注意栈的生长方向
CISC与RISC
所谓CISC和RICS指复杂/精简指令集
CISC一条指令完成复杂的基本功能:x86<br>
2-8法则:典型程序中80%的语句仅仅使用了处理器20%的指令<br>
复杂功能用电路往往不好实现
存储程序:由相对通用的电路配合一个存储器完成<br>一条复杂指令,这种程序称为“微程序”<br>
可选实现“指令流水线”
RICS一条指令完成一个基本“动作”,多<br>条指令组合完成复杂的基本功能:ARM<br>
一条指令一个电路,设计简单, 功耗低<br>
复杂逻辑用组合逻辑控制,效率高于“微程序”
方便“并行”“流水线”的技术实现
<br>
基本概念<br>
控制器的基本功能
解析指令
根据指令控制、协调其他部件工作
程序编译都会形成一系列指令,包含操作码和地址码<br>
指令
操作码OP
地址码A
停机指令无需地址码(地址码无意义)<br>
一般以<span class="equation-text" data-index="0" data-equation="A_i" contenteditable="false"><span></span><span></span></span>表示主存地址,<span class="equation-text" data-index="1" data-equation="(A_i)" contenteditable="false"><span></span><span></span></span>表示地址中的数据
是计算机的最小功能单位
隐指令
指令系统有部分不提供给用户直接使用的指令,由CPU自动管理、产生、执行。<br>
隐指令不属于任何指令分类,分类是在用户指令的基础上讨论的<br>
指令集(指令系统)
一台计算机支持的指令的集合
CPU架构如x86、ARM...的指令集不同
指令格式
分类
根据地址码数目
0地址指令
空操作、停机、关中断等
堆栈型计算机中,操作数隐含的放在栈顶和次栈顶,计算结果压回栈顶
表达式计算
1地址指令<br>
操作只需一个操作数:+1、-1、取反、求补等
完成一次需要3次访存:取指、读地址、写地址
需要两个操作数,但是另一个操作数隐含在某个寄存器(如ACC)
完成一次指令需要2次访存:取指、读A1<br>(写ACC不需要访存)<br>
2地址指令
操作需要2个操作数
完成一次需要4次访存:取指、读A1、读A2、写A1
默认是写回A1的
3地址指令
操作需要2个操作数<br>有一个写回地址<br>
完成一次需要4次访存:取指、读A1、读A2、写A3
三地址指令的A3是显式给出的写回地址
4地址指令
操作需要2个操作数<br>有一个写回地址<br>有一个下一指令地址<br>
完成一次需要5次访存:取指、读A1、读A2、写A3、读A4
四地址指令的A3是显式给出的写回地址
其他指令执行完PC+1,四地址指令执行完PC=<font color="#F44336">(A4)</font>
注意是(A4)
根据指令长度
3个字长
机器字长:绝对不变,取决于ALU
存储字长:取决于存储单元设计,一般和MDR位数相同
指令字长:可变,所谓x字长指令<br>是指的指令长度是机器字长的x倍<br>
指令字长影响取指所需时间
变长指令字结构:指令集中指令不等长<br>
定长指令字结构:指令集中指令等长<br>
半字长指令
单字长指令
双字长指令
根据操作码长度
可变长操作码<br>
定长操作码
n位指令字长最多支持2^n条指令
译码简单,灵活性低
根据操作类型
数据传送
LOAD存储器→寄存器、STORE寄存器→存储器
算术逻辑操作
算数
加减乘除、增1、减1、求补、浮点、十进制
逻辑
与、或、非、异或、位操作、位测试、位清除、位取反
移位操作
算数
逻辑
循环
带进位、不带进位
转移操作<br>任何转移操作都会改变PC<br>
无条件转移JMP
条件转移:JZ结果为0、JO结果溢出、JC结果有进位
调用CALL、返回RETURN<br>
陷阱(Trap)与陷阱指令
输入输出操作
CPU寄存器到IO端口的数据传送
IO端口即为IO接口中的寄存器
扩展操作码指令格式<br>定长指令字结构+可变长操作码<br>
不同地址数的指令使用不同长度的操作码
以16位指令字长,每个地址码占4位为例
对于3地址指令,操作码只有4位,对应16种组合,但只取15条作为3地址指令,留一条1111用于扩展到其他长度的操作码<br>
同理将16条1111xxxx型操作码分配给15条2地址指令和1条扩展操作码
同理将16条1111 1111 xxxx型操作码分配给15条1地址指令和1条扩展操作码
将16条1111 1111 1111 xxxx型操作码分配给16条0地址指令<br>
扩展操作码可以超过一条,只要等长操作码少几条就行
例<br>
<br>
不允许短码是长码的前缀<br>参考哈夫曼编码<br>
操作码不可重复
对使用频率较高的指令分配较短的操作码,尽可能减少指令译码和分析的时间
OS中的重定位寄存器就是BR
X86汇编指令简介
主要寄存器表
x86处理器有8个32位通用寄存器
名称不分大小写
EAX、EBX、ECX、EDX高两位、低两位分别可独立使用<br>
低两字节称xX,总称ExX
低两位可分为xH和xL
除了EBP和ESP外,其他寄存器的用途相对任意
各寄存器名称及含义说明
寻址模式
以mov为例
在内存和寄存器间移动数据,参数1是目的地址,参数2是源地址
使用例
错误用例 注:最多只能利用两个32bit寄存器和1个32bit的有符号常数相加计算得一个内存地址<br>
数据类型长度<br>内存分配<br>
一般显式地使用DB(Data Byte),DW(Data Word(2B/word)),DD(Data Double Word(4B))
对于无特殊标记的情况,可以用“byte ptr”“word ptr”“dword ptr”<br>
指令表
符号<br>
<reg>(<reg8>/<reg16>/<reg32>)寄存器
<mem>内存地址
<con>(<con8>/<con16>/<con32>)常数
数据传送指令(3)
mov<br>移动<br>
mov <reg>,<reg><br>
mov <reg>,<mem><br>
mov <mem>,<reg><br>
mov <reg>,<con><br>
mov <mem>,<con><br>
不能直接从内存复制到内存<br>
mov <mem>,<mem>不合法<br>
push<br>压栈<br>
push <reg32><br>push <mem><br>push <con32><br>
pop<br>出栈<br>
pop edi<br>pop [eax]<br>
算数和逻辑运算(8(13))<br>
add/sub 加减<br>
结果存到第一操作数
inc/dec 自增自减<br>
imul 带符号整数乘法<br>
2操作数:两数相乘,结果放到第一个寄存器
3操作数:第二、三操作数相乘,结果放到第一个寄存器
idiv 带符号整数除法<br>
操作数为除数
被除数是eax,结果:商回送eax,余数edx
and/or/xor 位逻辑运算,结果写回第一个操作数<br>
not 位取反<br>
neg 取负<br>
shl/shr 逻辑左/右移位<br>
控制流指令
jmp<br>无条件跳转<br>
可以通过标签实现指示指令<br>jmp标签即可<br>
jmp <label><br>
cmp<br>比较<br>
cmp <reg>,<reg><br>cmp <reg>,<mem><br>cmp <reg>,<con><br>cmp <mem>,<reg><br>
比较结果存于PSW<br>
jcondition<br>条件跳转<br>
je <label> ;when equal<br>
jne <label> ;when not equal<br>
jz <label> ;when last result is 0<br>
jg <label> ;when greater than<br>
jge <label> ;when ≥<br>
jl <label> ;when less than
jle <label> ;when ≤
call/ret<br>子程序调用/返回<br>
call <label><br>ret<br>
0 条评论
下一页