一 指令的一般格式
| 操作码 | 地址码 |
1.操作码:反映机器具体做什么操作
(1)长度固定:用于指令字长较长的情况(RISC),如IBM370操作码固定为8位。
(2)长度可变:操作码分散在指令字的不同字段中。
(3)扩展操作码技术:操作码位数随地址码位数的减少而增加。
| OP | A1 | A2 | A3 |
-----------------------------------------------最多15条三地址指令
0000 A1 A2 A3
......
1110 A1 A2 A3 /*四位操作码*/
----------------------------------------------最多15条二地址指令
1111 0000 A2 A3 /*高四位1111为扩展标志*/
......
1111 1110 A2 A3 /*八位操作码*/
-----------------------------------------------最多15条一地址指令
1111 1111 0000 A3 /*高八位1111 1111为扩展标志*/
......
1111 1111 1110 A3 /*十二位操作码*/
----------------------------------------------16条零地址指令
1111 1111 1111 0000 /*1111 1111 1111为扩展标志*/
......
1111 1111 1111 1111 /*十六位操作码*/
在计算机中越常用的指令操作码长度越短,越不常用的指令操作码长度越长(如霍夫曼树)
2.地址码
(1)四地址指令
| OP | A1 | A2 | A3 | A4 |
| 8位 | 24位 |
寻址范围为2^6=64
A1:第一操作数地址;A2:第二操作数地址;A3:结果的地址;A4:下一条指令的地址
经历取指令,取操作数(A1,A2),存数(A3)四次访存
(2)三地址指令(用PC代替A4)
| OP | A1 | A2 | A3 |
| 8位 | 24位 |
寻址范围为2^8=256
A1:第一操作数地址;A2:第二操作数地址;A3:结果的地址
经历取指令,取操作数(A1,A2),存数(A3)四次访存 (A1)OP(A2)——>A3
(3)二地址指令(由A1/A2代替A3,即结果数暂存在操作数寄存器中)
| OP | A1 | A2 |
| 8位 | 24位 |
寻址范围为2^12=4K
A1:第一操作数地址;A2:第二操作数地址
经历取指令,取操作数(A1,A2),存数(A1/A2)四次访存 (A1)OP(A2)-->A1/A2
若将结果数存在ACC中则只需经历3次访存 (A1)OP(A2)-->ACC
(4)一地址指令(由ACC代替A2)
| OP | A1 |
| 8位 | 24位 |
寻址范围为2^24=16M
将操作数2存于ACC中,结果数同样存于ACC中
经历取指令,取操作数(A1)2次访存 (ACC)OP(A1)-->ACC
(5)零地址指令(堆栈类指令等)
二 指令字长(取决于操作码的长度,操作数地址的长度,操作数地址的个数)
1.指令字长固定:则指令字长=存储字长
2.指令字长可变:则按照字节倍数变化
3.小结:
当用一些硬件资源(如ACC,PC)代替指令字中的地址码字段后:
(1)可以扩大指令寻址范围
(2)可以缩短指令字长
(3)可以减少访存次数
当指令地址字段指向寄存器时:
如三地址:| OP | R1 | R2 | R3 |;二地址:| OP | R1 | R2 |;一地址:| OP | R1 |
(1)可缩短指令字长
(2)指令执行阶段不访存(和寄存器直接交换数据)
一 操作数类型
地址:无符号整数(绝对地址);有符号整数(相对地址)
数字:定点数,浮点数,十进制数
字符:ASCII
逻辑数:逻辑运算
二 数据在存储器中的存放格式
例:12345678H在32位存储器中的存放格式
大端存储:(字地址为高位字节地址)
字地址 | ||||
---|---|---|---|---|
0 | 12H | 34H | 56H | 78H |
4 |
小端存储:(字地址为低位字节地址)
字地址 | ||||
---|---|---|---|---|
0 | 78H | 56H | 34H | 12H |
4 |
a. 从任意位置开始存储
1 | * | – | – | – | – | / | / | / |
---|---|---|---|---|---|---|---|---|
2 | / | / | / | / | / | |||
3 | ||||||||
4 |
优点:不浪费任何存储资源
缺点:除了访问一个字节以外,访问任何长度的数据(字,半字等)都有可能需要两个存储周期,读写控制比较复杂
b. 从一个存储字的起始位置开始访问
1 | * | |||||||
---|---|---|---|---|---|---|---|---|
2 | / | / | / | / | / | / | / | / |
3 | - | - | - | - | ||||
4 | + | + |
优点:无论访问何种类型的数据在一个存储周期内均可完成,读写控制简单
缺点:浪费了很多宝贵的存储资源
c. 边界对准方式——从地址的整数倍位置开始访问
1 | * | / | / | / | / | |||
---|---|---|---|---|---|---|---|---|
2 | - | - | - | - | - | - | - | - |
3 | + | + | = | = | = | = | ||
4 |
数据存放的起始地址是数据长度(按照编址单位计算)的整数倍,本方案是对前两种方案的折中,在一个存储周期内可以完成存储访问,空间浪费也不太严重
二 操作类型
1.数据传送指令
数据源 | 寄存器 | 寄存器 | 存储器 | 存储器 |
---|---|---|---|---|
目的 | 寄存器 | 存储器 | 寄存器 | 存储器 |
指令举例 | MOVE | LOAD / MOVE / POP | STORE / MOVE/ PUSH | MOVE |
2.算术逻辑操作
加,减,乘,除,增1,减1,求补,浮点运算,与,或,非,异或等参与算数逻辑运算的操作
如8086中的:ADD,SUB,MUL,DIV,DEC,CMP,NEG,AAA,AAS,AAM,AAD,AND,OR,NOT,XOD,TEST等
3.移位操作
算数移位,逻辑移位,循环移位(带进位和不带进位)
4.转移指令
(1)无条件转移:JMP
(2)条件转移:JZ(结果为0则转移);JC(结果有进位则转移);JO(结果溢出则转移);SKP(跳过一条指令)
(3)调用和返回(如函数的调用)
(4)陷阱(TRAP)和陷阱指令,意外事故的中断:
一般不提供给用户使用,而是出现事故时,由CPU自动产生并执行(隐指令)。
5.输入输出指令(并非所有的指令集都有输入输出指令):
输入:端口中的内容——>CPU寄存器(IN)
输出:CPU寄存器——>端口中的内容(OUT)
寻址指确定本条地址的操作数地址或下一条要执行的指令的指令地址
一 指令寻址
顺序寻址:(PC)+1 ——> PC(这个1代表指令长度,单位为字节)
跳跃寻址:由转移指令指出
二 数据寻址
| 操作码 | 寻址特征 | 形式地址A |
形式地址A是指令字中的地址;有效地址是操作数的真实地址(由寻址特征和形式地址一同得出)
约定:指令字长=机器字长=存储字长;接下来介绍数据寻址的10种方式
1.立即寻址:形式地址A就是操作数
| 操作码 | 寻址特征# | 操作数 |
(1)在取指时操作数就已经被取到CPU中,指令执行阶段不访存
(2)A的位数限制了立即数(即操作数)的范围,立即数补码表示可正可负
(3)#为立即寻址的寻址特征
2.直接寻址:有效地址=形式地址A(EA=A)
| 操作码(如LDA) | 直接寻址寻址特征 | 有效地址A |
(1)执行阶段根据指令中的地址码访问一次存储器
(2)A的位数决定了该指令操作数的寻址范围
(3)有效地址A即为物理单元内存地址
(4)操作数的地址不易修改(修改时必须同时修改指令中的A)
3.隐含寻址
| 操作码如(ADD) | 隐含寻址寻址特征 | 有效地址A |
如8086中MUL指令,被乘数被隐含在AX(16位)或AL(18位)中
(1)指令字中少了一个地址字段,可缩短指令字长
(2)有效地址A指向一个操作数,另一操作数隐含在硬件资源如ACC中,两操作数同时被输入ALU中进行运算
4.间接寻址:有效地址由形式地址间接提供(EA=(A))
| OP | 间接寻址寻址特征 | 形式地址A |
一次间址:
(1)执行阶段两次访存;可扩大寻址范围(EA比A长);便于编制程序
(2)便于编制程序是指通过修改EA来修改指令数的真正物理地址,不用修改指令中的形式地址字段
(3)第一次根据A访存找到A中存放的有效地址EA,再根据EA找到操作数
多次间址:执行阶段多次访存
5.寄存器寻址:有效地址即为寄存器编号
| 操作码 | 寄存器寻址寻址特征 | 寄存器地址Ri |
(1)执行阶段不访存,只访问寄存器,执行速度快(寄存器直接寻址)
(2)寄存器个数有限,可以缩短指令字长
6.寄存器间接寻址:有效地址存在寄存器中(EA=(Ri))
| 操作码 | 寄存器间接寻址寻址特征 | 形式地址Ri |
(1)有效地址存放在寄存器中,操作数存放在存储器中,执行阶段需要访存
(2)便于编制循环程序
7.基址寻址
采用专用寄存器(BR)作为基址寄存器
| 操作码 | 基址寻址寻址特征 | 有效地址A |
BR:| 有效地址A2 |
(1)有效地址为基址寄存器中的地址加上指令中的地址EA=(BR)+A
(2)可以扩大寻址范围
(3)有利于编制多道程序(主要也应用于多道程序)
(4)BR中内容由操作系统或管理程序确定,执行过程中BR内容不变,形式地址A可变
采用通用寄存器作基址寄存器
| 操作码 | 基址寻址寻址特征 | 有效地址A |
通用寄存器Ri:| 有效地址A2 |
(1)通用寄存器R0作为基址寄存器
(2)由用户指定哪个通用寄存器作为基址寄存器
(3)基址寄存器内容由操作系统确定,执行过程中R0内容不变,形式地址A可变
8.变址寻址 EA=(IX)+ A
| 操作码 | 变址寻址寻址特征 | 有效地址A |
IX:| 有效地址A2 |
(1)IX为变址专用寄存器,也可用通用寄存器实现
(2)可以扩大寻址范围,IX内容由用户给定,在执行过程中,A固定,IX可变
(3)便于处理数组问题
9.相对寻址 EA=(PC)+ A
| 操作码 | 基址寻址寻址特征 | 相对于目前指令的偏移量A |
PC:| 当前指令地址PC |
(1)A是相对于当前执行指令的地址偏移量,补码表示可正可负
(2)A的位数决定操作数寻址范围
(3)有利于程序浮动
(4)广泛应用于转移指令
10.堆栈寻址
(1)堆栈的特点:硬堆栈——多个寄存器;软堆栈——指定的存储空间;先进后出(堆栈只有一个出入口);栈顶地址由SP指出;进栈(SP)-1——>SP;出栈(SP)+1——>SP
(2)堆栈寻址举例(略)
(3)SP的修改与主存编址方法有关
a. 按字编制:进栈(SP)-1——>SP;出栈(SP)+1——>SP
b. 按字节编址:
存储字长16位:进栈(SP)-2——>SP;出栈(SP)+2——>SP
存储字长32位:进栈(SP)-4——>SP;出栈(SP)+4——>SP
寻址方式 | 有效地址计算方式 | 用途及特点 |
---|---|---|
立即寻址 | 通常用于给寄存器赋初值 | |
直接寻址 | EA=A | |
隐含寻址 | 缩短指令字长 | |
一次间接寻址 | EA=(A) | 扩大寻址范围,易于完成子程序返回 |
寄存器寻址 | EA=Ri | 指令字较短,执行执行速度较快,不用访存 |
寄存器间接寻址 | EA=(Ri) | 扩大寻址范围 |
基址寻址 | EA=A+(BR) | 扩大操作数范围,适用于多道程序设计,常用于为程序或数据分配空间 |
变址寻址 | EA=A+(IX) | 主要用于处理数组问题 |
相对寻址 | EA=A+(PC) | 用于转移指令和程序浮动 |
先间址再变址 | EA=(A)+(IX) | |
先变址再间址 | EA=(A+(IX)) |
略过