导图社区 3.80868088指令系统
指令系统,指令的寻址方式,数据传送指令,算数运算指令,逻辑运算指令,串操作指令,控制转移类指令,处理器控制指令。
编辑于2022-05-22 09:51:288086/8088指令系统
指令的寻址方式
指令的一般格式
指令是计算机执行某种操作命令,指令系统是CPU所有可执行的指令的集合
助记符 目的操作数,源操作数
操作数有三种类型:立即数,寄存器操作数和存储器操作数
寻址方式,即获得操作数地址的方法
立即寻址
立即数作为操作数,立即数只能是指令的源操作数
寄存器寻址
操作数存放在CPU寄存器中
寄存器操作数可以是源操作数,也可以是目的操作数
存储器寻址
操作数存放在存储器的内存单元中,指令中给出操作数所在的存储单元的偏移地址(有效地址EA),有效地址写在方括号内[]
段地址在默认的段寄存器DS中,也可使用段超越前缀指定段寄存器 :格式 段寄存器:[EA]
直接寻址
存储器操作数的16位偏移地址,直接包含在指令的方括号中,即有效地址EA=指令所给出的数值
寄存器间接寻址
操作数在内存中,内存单元的偏移地址存放在寄存器中,如 : mov ax,[bx],操作数的偏移地址就是bx中的值
寄存器间接寻址方式,使用的寄存器只有4个:BX,BP,SI,DI
BX,SI,DI默认的段基址为DS,BP默认的段基址为SS
寄存器相对寻址
内存单元的偏移地址一部分由间接寻址寄存器提供,一部分是指令给定的8位或16位地址位移量,二者相加形成操作数的有效地址
如 :mov ax,[bx+data],偏移地址由bx的值加上data的值
基址加变址寻址
偏移地址是一个基址寄存器(BX,BP)与变址寄存器(SI,DI)的和
有效地址EA = BX/BP + SI/DI
段寄存器由基址寄存器决定,BX的段寄存器为DS,BP的段寄存器为SS
注:基址寄存器BX,BP,变址寄存器DI,SI不能同时出现
基址变址相对寻址
偏移地址由基址寄存器加变址寄存器再加上地址位移量
例 mov ax,[bx+si+data]
I/O端口寻址
直接寻址
直接端口寻址的I/O端口地址用8位立即数表示,端口地址范围 0~FFF,可寻址256个端口
如 IN AL,30H 将30h端口的内容送入AL中
间接寻址
若端口地址超过8位,则必须用间接端口寻址。端口的16位地址必须存放在DX中,即DX值表示I/O端口地址
如 MOV DX, 230h IN AL,DX 将地址为230h的端口中的内容送入AL
数据传送指令
mov指令
指令格式:mov 目的操作数,源操作数
MOV指令的注意事项
两个操作数不能同时为存储操作数
两个操作数不能同时为段寄存器
两个操作数类型必须相同
mov指令不影响flags寄存器的任何标志
不能用立即数给段寄存器幅值
不允许给CS赋值
MOV 指令中的两个操作数的类型必须至少有一个是确定的
传送数据的时候,必须指明数据的单位,如是字节还是字类型
PTR 修改操作数类型的属性运算符
BYET PTR 字节
如 MOV BYET PTR [1000H],10
BYET PTR 指明了[1000h]是字节类型
WORD PTR 字
如 MOV WORD PTR [1000H],10
WORD PTR 指明了[1000h]是字类型
立即数到通用寄存器的数据传送 mov 寄存器,立即数
立即数到存储单元的数据传送 mov [EA],立即数
CPU内部寄存器之间的数据传送
寄存器与存储单元之间的数据传送
xchg指令
格式:XCHG 目的操作数,源操作数
功能:将源操作数和目的操作数的值交换
LEA指令
格式:LEA 目的操作数,源操作数
功能:把源操作数的偏移地址送入目的操作数,源操作数必须是一个内存操作数,目的操作数必须是一个16位通用寄存器
push与pop指令
push
将操作数指定的一个字的内容传送至SP所指的栈顶
操作数必须是字类型(16位)
立即数不能做操作数
不影响标志位
压入堆栈:sp = sp - 2,再存入一个字
pop
将SP所指的栈顶内容传送至操作数指定的一个字
操作数必须是字类型(16位)
立即数不能做操作数
不影响标志位
出栈过程:将sp所指的字传送至操作数,SP = SP+2
pushf和popf指令
pushf 将标志寄存器flags压入堆栈
popf 将当前栈顶的内容弹出到标志寄存器flags
IN和OUT指令
I/O设备与CPU只能通过累加器AX,AL进行数据交换
IN指令
将I/O设备的数据传送给AL,AX
当端口地址为8位可直接使用,如 IN AL/AX,8位端口地址
当端口地址为16位,先将端口地址送入DX中,再使用。 如 MOV DX,端口地址 IN AL/AX,DX
OUT指令
将AX,AL中的数据是送入I/O设备
当端口地址为8位可直接使用,如 OUT 8位端口地址,AL/AX
当端口地址为16位,先将端口地址送入DX中,再使用。 如 MOV DX,端口地址 OUT DX,AL/AX
算术运算指令
ADD 加法指令
格式:ADD 目的操作数,源操作数
功能:目的操作数 = 目的操作数+源操作数
影响 Flags 寄存器的值
ADC 带进位的加法指令
格式:ADC 目的操作数,源操作数
功能:目的操作数 = 目的操作数+源操作数+CF
影响flags寄存器的值
INC 加1指令
格式:INC 操作数
功能:操作数 = 操作数+1
INC指令不影响CF标志
SUB 减法指令
格式:SUB 目的操作数,源操作数
功能:目的操作数=目的操作数-源操作数
影响flags标志寄存器
SBB 带进位的减法指令
格式:SBB 目的操作数,源操作数
功能:目的操作数=目的操作数-源操作数-CF
影响flags标志寄存器
DEC 减1指令
格式:DEC 操作数
功能:操作数 = 操作数-1
不影响CF标志位
NEG 求补指令
格式 NEG 操作数
功能:将操作数按位取反(包括符号位)加1
CMP 比较指令
格式: CMP 目的操作数,源操作数
功能:目的操作数减源操作数,不保留运算结果,只根据结果设置标志位
影响flags寄存器
MUL 无符号数乘法
格式:MUL 操作数
功能:当操作数为字节时,AX = AL * 操作数; 当操作数为字类型时, DX:AX = AX*操作数
注意:两个操作数的类型必须相同,指令影响标志位CF,OF位
字节乘法的乘积在AX中,如果标志位 CF=OF=0,表明AH为0,CF=OF=1,表明AH不为0,字相乘的乘积在DX:AX中,如果标志位CF=OF=1,表示乘积的高位DX不为0,CF=OF=0,表示乘积的高位DX为0
IMUL 带符号数乘法
格式:IMUL 操作数
功能:与MUL指令一样,处理有符号的乘法
DIV无符号数除法
格式:DIV 操作数
功能:当操作数为字节时,AL = AX / 操作数的商,AH = AX / 操作数的余数;当操作数为字时,AX = DX:AX / 操作数的商,DX=DX:AX / 操作数的余数
注意:被除数长度应为除数长度的两倍,余数放在目的操作数的低位,商放在目的操作数的高位;除数不能为0,除数不能太小,否则将产生溢出
IDIV 带符号数除法
格式:IDIV 操作数
功能:与DIV指令功能一样,处理有符号的数
注意:当长度不一致时,应使用符号扩展指令
符号扩展指令CBW,CWD
使用符号扩展指令对数据类型进行调整,指令不影响标志位
指令格式:CBW
功能,字节转换为字。将AL中的数的符号位扩展至16位,扩展的符号部分存入AH中,既由AL扩展为AX,值保持不变
指令格式:CDW
功能,字转换为双字。将AX中的数的符号位扩展至32位,扩展的符号部分存入DX中。即由DX:AX代替,值保持不变
逻辑运算指令
与指令AND
指令格式:AND 目的操作数,源操作数
功能:目的操作数 = 目的操作数按位与源操作数
对flags的影响:CF=OF=0,AF值不定
常用于对某些位置0
或指令OR
格式:OR 目的操作数,源操作数
功能:目的操作数 = 目的操作数按位或源操作数
对flags的影响:CF=OF=0,AF值不定,对SF,PF,ZF产生影响
常用对某些位置1
非指令NOT
格式: NOT 操作数
功能: 操作数 = 操作数按位取反
不影响标志位
异或指令XOR
格式: XOR 目的操作数,源操作数
功能:目的操作数 = 目的操作数按位异或源操作数
对flags的影响:CF=OF=0,AF值不定,SF,ZF,PF值影响
常用于对某些位取反
TSET指令
格式:TEST 目的操作数,源操作数
功能:目的操作数与源操作数按位进行与操作,不保留结果,仅使flags寄存器的标志位做改变
对flags的值影响:CF=OF=0,AF值不定,SF,ZF,PF值影响
在条件转移之前,判断
非循环移位指令
逻辑左移指令SHL
格式:SHL 操作数,count (count大于1,应使用cl)
说明:操作数可以是寄存器或存储器操作数,count可以是立即数或CL
功能:将操作数的内容向左移位,移位的次数由count给出,每左移一位,操作数最高位的状态移入CF标志位,低位补0
逻辑右移指令SHR
格式:SHR 操作数,count(count大于1,使用cl)
操作:将操作数的内容向右移位,移位次数由count给定,每右移一位,操作数的最低位的状态移入CF标志位,高位补0
算术左移指令SAL
格式:SAL 操作数,count(count大于1,使用cl)
说明:算术移位指令将操作数看作带符号数
功能:与SHL指令的功能完全相同
算术右移指令SAR
格式: SAR 操作数,count
功能:将操作数的内容向右移位,每右移一位,操作数最末位移入CF标志位,最高位移入次高位的同时其值不变
循环移位指令
循环右移指令ROL
格式:ROL 操作数,count
功能:每左移一位,操作数最高位移出,送入CF标志位,还循环到左移一位空出的操作数最末位
循环左移指令ROR
格式:ROR 操作数,count
功能:每右移一位数,操作数最低位送入CF标志位,同时循环移位到空出的最高位上
带CF的循环右移RCL
格式:RCL 操作数,count
操作:每左移一位,操作数最高位移入CF中,CF原来的值移入最低位
带CF的循环左移RCR
格式:RCR 操作数,count
操作:每右移一位,操作数最低位移入CF中,CF原来的值移入最高位
串操作指令
串操作指令对内存中连续存放数据串进行操作
DF标志:串操作方向标志,DF = 0,SI和DI增量;DF = 1,SI和DI减量,CLD设置DF为0,STD,设置DF为1
串操作指令的共同特点
格式: 串操作指令 目的串,源串
1.源串默认为数据段DS,允许段超越为SS,ES,偏移地址在SI中
2.目的串默认在ES段中,偏移地址在DI中
3.使用重复前缀时,串长度放在CX寄存器中
4.地址指针和计数器自动修改
使用串操作指令之前,应预先设置源串指令DS:SI,目的串指令ES:DI,重复次数CX,方向标志位DF;
串传送指令movs
格式:MOVS 目的串,源串(段超越形式)
MOVSB,以字节为单位传送
MOVSW,以字为单位传送
功能:将DS:SI指明的内存单元数据传送到ES:DI指明的内存单元中
常用的重复前缀 REP
源串取数指令LODS
指令格式:LODS 源串
LODSB 以字节为单位
LODSW 以字为单位
功能:从串中取数据。将DS:SI指明的串中元素传送到AL或AX中,同时修改SI指向下一个字节或字
指令不加重复操作前缀,常常用在循环中
目的串存数指令STOS
指令格式:STOS 目的串
STOSB 以字节为单位
STOSW 以字为单位
功能:把数据存入串中。把AL或AX中的数据传送到ES:DI指明的串中
一般带有重复操作前缀REP,用AL或AX初始化某数据区
串比较指令CMPS
格式:CMPS 目的串,源串
CMPSB,以字节为单位
CMPSW,以字为单位
功能:数据串比较。将DS:SI指明的源串 - ES:DI指明的目的串,不保留结果,比较结果反映在标志位上,源串与目的串的内容不变
常用的重复前缀为:REPE或REPNE
串扫描指令SCAS
指令格式:SCASB 以字节为单位;SCASW 以字为单位
功能:ES:DI指明的串中搜素特定数据,特定数据存在AL(或AX)中
常用的重复前缀:REPE,REPNE
重复操作前缀
REP
无条件执行,直到 CX = 0 结束
REPE
相等时重复,即 ZF=1,且 CX ≠ 0 时重复
REPNE
不相等时重复,即ZF = 0,且 CX ≠ 0 时重复
控制转移类指令
控制转移类指令通过改变IP和CS的值,实现程序执行顺序的改变
转移指令
无条件转移指令JMP
格式:JMP 目标标号
根据目标标号的类型,可以进行短转移short和近转移near,远转移far
JMP 段基址:偏移地址 ;把段基址的值送入CS中,偏移地址送入IP
JMP指令不影响标志位
条件转移指令
条件转移指令根据标志位来判断是否进行转移,条件转移指令常跟在CMP指令与TEST指令后
注意:条件成立执行转移操作,若不成立则不转移并顺序执行下一条指令,所有的条件转移指令属于段内短转移,均不影响标志位
指令格式:JCC 目标标号
无符号数转移指令,a大于,b小于
JA/JNBE
JAE/JNB
JB/JNAE
JBE/JNA
带符号数转移指令 g大于,l小于
JG/JNLE
JGE/JNL
JL/JNGE
JLE/JNG
单个条件标志转移指令
JCXZ CX=0转移
JO OF=1
JNO OF=0
JS
JNS
JC
JNC
JZ
JNZ
JP
JNP
循环控制指令
利用CX作为计数控制循环,都不影响标志位
LOOP 目标标号 当CX≠0
LOOPZ(LOOPE) 目标标号 当CX=CX-1,CX≠0,ZF=1
LOOPNZ(LOOPNE) 目标标号 当CX=CX-1,CX≠0,ZF=0
中断指令
INT指令
指令格式:INT n
说明:n为中断类型码,取值范围0~255。
INT3指令
指令格式:INT3
说明:INT3是 中断类型码为3的中断服务程序
INTO指令
指令格式:INTO
说明:INTO为溢出中断,相当于INT 4指令。INTO 指令执行时检查OF位,若 OF = 1,则进入中断类型码为4的中断服务程序,若OF=0,则指令执行结束
IRET指令
指令格式:IRET
功能:中断返回
说明:所有中断服务程序中最后一条指令都是IRET,它的具体操作:1.弹出IP 2.弹出CS 3.弹出flags
过程调用指令
过程是可重复使用在存储器中的一段程序。
过程的定义:过程名 PROC [属性].....过程名 ENDP
过程调用指令CALL
格式:CALL 过程名
执行过程:第一步保存返回地址,第二步取出过程入口地址赋给CS:IP,转去执行过程
过程返回指令 RET
格式:RET
功能:返回调用程序
返回指令放在过程的末尾,功能是弹出返回地址,送给IP和CS
处理器控制指令
CLC 使CF=0
STC 使CF=1
CLD 使DF=0
STD 使DF=1
CLI 使IF=0
STI 使IF=1
CMC 对CF标志位取反
WAIT 等待
HIT 暂停
NOP 空操作