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