是指示计算机执行某种操作的命令,是计算机运行的最小功能单位
一台计算机的所有指令的集合构成该机的指令系统,也称为指令集
注:一台计算机只能执行自己指令系统中的指令,不能执行其他系统的指令。
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码。
操作码:用户要干什么?
地址码:对谁进行操作?
有的指令不需要地址码(停机)
1. 不需要操作数,如空操作、停机、关中断等指令
2. 堆栈计算机,两个操作数隐含存放在栈顶和次栈顶,计算结果压回栈顶 Eg:数据结构:“后缀表达式”
完成一条指令需要3次访存:取指 →读A1 →写A1
注:A1 指某个主存地址, (A1)表示 A1 所指向的地址中的内容
2. 需要两个操作数,但其中一个操作数隐含在某个寄存器(如隐含在ACC) 完成一条指令需要2次访存:取指 → 读A1
常用于需要两个操作数的算术运算、逻辑运算相关指令
完成一条指令需要访存4次,取指 →读A1 →读A2 →写A1
常用于需要两个操作数的算术运算、逻辑运算相关指令
完成一条指令需要访存4次,取指 →读A1 →读A2 →写A3
指令含义:(A1)OP(A2)→A3,A4=下一条将要执行指令的地址
完成一条指令需要访存4次,取指 →读A1 →读A2 →写A3
正常情况下:取指令之后PC+1,指向下一条指令
四地址指令:执行指令后,将PC的值修改为A4所在地址
指令字长:一条指令的总长度(可能会变)
机器字长:CPU进行一次整数运算所能处理的二进制数据的位数(通常和ALU直接相关)
存储字长:一个存储单元中的二进制代码位数(通常和MDR位数相同)
半字长指令、单字长指令、双字长指令 ——指令长度是机器字长的多少倍
指令字长会影响取指令所需时间。如:机器字长=存储字长=16bit,则取一条双字长指令需要两次访存
定长指令字结构:指令系统中所有指令的长度都相等
变长指令字结构:指令系统中各种指令的长度不等
n位→2条指令
控制器的译码电路设计简单,但灵活性较低
控制器的译码电路设计复杂,但灵活性较高
LOAD 作用:把存储器中的数据放到寄存器中
STORE 作用:把寄存器中的数据放到存储器中
数据传送类:进行主存与CPU之间的数据传送
数据传送类:进行主存与CPU之间的数据传送
算术:加、减、乘、除、增 1、减 1、求补、浮点运算、十进制运算
逻辑:与、或、非、异或、位操作、位测试、位清除、位求反
算术移位、逻辑移位、循环移位(带进位和不带进位)
无条件转移 JMP
条件转移 JZ:结果为0; JO:结果溢出; JC:结果有进位
调用和返回 CALL和RETURN
陷阱(Trap)与陷阱指令
程序控制类:改变程序执行的顺序
CPU寄存器与IO端口之间的数据传送(端口即IO接口中的寄存器) 输入输出类(I/O):进行CPU和I/O设备之间的数据传送
运算类
定长操作码:指令系统中所有指令的操作码长度都相同
可变长操作码:指令系统中各指令的操作码长度可变
定长指令字结构+可变长操作码 →扩展操作码指令格式
不同地址数的指令使用不同长度的操作码
1.不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
对比数据结构的“哈夫曼树”的“前缀编码”
2.各指令的操作码一定不能重复。
通常情况下,
对使用频率较高的指令,分配较短的操作码;
对使用频率较低的指令,分配较长的操作码;
从而尽可能减少指令译码和分析的时间
设地址长度为n,上一层留出m种状态,下一层可扩展出m×2种状态
优:在指令长度有限的前提下仍保持比较丰富的指令种类
缺:增加了指令译码和分析的难度,使控制器的设计复杂化
确定下一条要执行的指令的存放地址
始终由程序计数器PC指明
(PC)+ "1"——> PC
此处的"1"要理解为1个指令字长
每次取指令结束后,一定会PC+"1"
执行转移类指令导致的PC值改变
每一条指令的执行都分为“取指令”、“执行指令”两个阶段
确定本条指令的地址码指明的真实地址
求出操作数的真实地址成为有效地址(EA)
指令字中的形式地址A就是操作数的真实地址EA,即EA=A
一条指令的执行:取指令,访存1次;执行指令,访存1次;
暂不考虑存结果,共访存2次
优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址
缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)
优点:可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。
便于编制程序(用间接寻址可以方便地完成子程序返回)。
缺点:指令在执行阶段要多次访存(1次间址需2次访存,多次寻址需根据存储字的最高位确定几次访存)
在指令字中直接给出操作数所在的寄存器编号,即EA=R,其操作数在由R所指的寄存器内。
一条指令的执行:取指令,访存1次;执行指令,访存0次;
暂不考虑存结果,共访存1次
优点:指令字短且执行速度快,支持向量/矩阵运算。
指令在执行阶段不访问主存,只访问寄存器
缺点:寄存器价格昂贵,计算机中寄存器个数有限
寄存器R中给出的不是一个操作数,而是操作数所在主存单元的地址,即EA=(R)
一条指令的执行:取指令,访存1次;执行指令,访存1次;
暂不考虑存结果,共访存2次
特点:与一般间接寻址相比速度更快,但指令的执行阶段需要访问主存(因为操作数在主存中)。
不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址
优点:有利于缩短指令字长
缺点:需增加存储操作数或隐含地址的硬件
形式地址A就是操作数本身,又称为立即数,一般采用补码形式
#表示立即寻址特征
一条指令的执行:取指令,访存1次;执行指令,访存0次;
暂不考虑存结果,共访存1次
优点:指令执行阶段不访问主存,指令执行时间最短
缺点:A的位数限制了立即数的范围,如A的位数为n,且立即数采用补码时,可表示的数据范围为-2~2-1
以某个地址作为起点,形式地址视为“偏移量”
几种偏移寻址的区别在于偏移的起点不一样
将CPU中基址寄存器(BR)的内容加上指令格式中的形式地址A,而形成操作数的有效地址,即EA=(BR)+A
以程序的起始存放地址作为起点
优点1:便于程序“浮动”,方便实现多道程序并发运行
基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定
在程序执行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)
当采用通用寄存器作为基址寄存器是时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍由操作系统决定
优点2:可扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪一空间区域,故有利于多道程序设计,以及可用于编制浮动程序(整个程序在内存里边的浮动)
有效地址EA等于指令字中的形式地址A与变址寄存器IX的内容相加之和,EA=(IX)+A,其中IX可为变址寄存器(专用),也可用通用寄存器作为变址寄存器
程序员自己决定从哪里作为起点
变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户改变(IX作为偏移量),形式地址A不变(作为基地址)
优点:在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任一数据的地址,特别适合编制循环程序
先基址后变址寻址:EA=(IX)+(BR)+A
把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址,即EA=(PC)+A,其中A是相对于PC所指地址的位移量,可正可负,补码表示
王道书的小错误:“A是相对于当前指令地址的位移量”
应为:“A是相对于下一条指令地址的位移量”
以程序计数器PC所指地址作为起点
优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序浮动(一段代码在程序内部的浮动)。
相对寻址广泛应用于转移指令
操作数存放在堆栈中,隐含使用堆栈指针(SP)作为操作数地址
只需关注x86汇编语言
能结合C语言看懂汇编语言的关键语句(看懂常见指令,选择结构,循环结构,函数调用)
结合汇编语言分析机器指令的格式、寻址方式
#mov指令功能:将源操作数s复制到目的操作数d所指的位置
dword ptr——双字,32bit
word ptr——单字,16bit
byte ptr——字节,8bit
若未指明主存读写长度,默认32bit
[地址]:地址所指的内容
一个十进制/十六进制数:立即数
EAX,EBX,ECX,EDX 通用寄存器(X=未知)
AX,BX,CX,DX 使用通用寄存器的低16bit
AH,BH,CH,DH 低16bit的高八位
AL,BL,CL,DL 低16bit的低八位
ESD,EDI 变址寄存器,变址寄存器可用于线性表,字符串的处理
EBP,ESP 堆栈基指针,堆栈顶指针,堆栈寄存器用于实现函数调用
每个寄存器都是32bit
目的操作数d不可以是常量
add d,s 加 #计算d+s,结果存入d
sub d,s 减 #计算d-s,结果存入d
mul d,s 乘 #无符号数d*s,乘积存入d
imul d,s 乘 #有符号数d*s,乘积存入d
div s 除 #无符号数除法 edx:eax/s,商存入eax,余数存入adx
idiv s 除 #有符号数除法 edx:eax/s,商存入eax,余数存入adx
neg d 取负数 #将d取负数,结果存入d
inc d 自增++ #将d++,结果存入d
dec d 自减-- #将d--,结果存入d
and d,s 与 #将d,s逐位相与,结果放入d
or d,s 或 #将d,s逐位相或,结果放入d
not d 非 #将d逐位取反,结果放入d
xor d,s 异或 #将d,s逐位异或,结果放入d
shl d,s 左移 #将d逻辑左移s位,结果放回d(通常s是常量)
shr d,s 右移 #将d逻辑右移s位,结果放回d(通常s是常量)
用于实现分支结构、循环结构的指令:cmp,test,jmp,jxx
用于实现函数调用的指令:push,pop,call,ret
用于实现数据转移的指令:mov
x86处理器中程序计数器PC通常被称为IP
CISC: Complex Instruction Set Computer 设计思路:一条指令完成一个复杂的基本功能。
代表:x86架构,主要用于笔记本、台式机等
RISC: Reduced Instruction Set Computer 设计思路:一条指令完成一个基本“动作”;多条指令组合完成一个复杂的基本功能
代表:ARM架构,主要用于手机、平板等