8086指令系统2.docx
《8086指令系统2.docx》由会员分享,可在线阅读,更多相关《8086指令系统2.docx(19页珍藏版)》请在冰豆网上搜索。
![8086指令系统2.docx](https://file1.bdocx.com/fileroot1/2023-1/5/fbb205b5-04a5-460b-b72f-15f24696c319/fbb205b5-04a5-460b-b72f-15f24696c3191.gif)
8086指令系统2
3.1.14串操作指令
字符串传送指令字符串比较指令字符串检索指令取字符串指令存字符串指令
1.字符串传送指令字符串传送指令MOVSB/MOVSW
MOVSB用于字节传送MOVSW用于字传送。
特点:
指令前面常加重复前缀REP如:
MOVSI,1000H;源地址为1000H
MOVDI,2000H;目的地址为2000H
MOVCX,100;字符串长100个字节
CLD;方向标志清0,使指针;按增量方向修改
REPMOVSB;将源地址开始的100个;字节传送到目的地址
MOVSB指令注意点:
①源地址用SI寄存器指出目的地址用DI寄存器指出
②CX中为字节数或字数。
③若DF为0,则用MOVSB时,每传送一次,SI和DI自动增1;用MOVSW时,每传送一次,SI和DI自动增2。
DF=1,则SI,DI变化方向?
2.字符串比较指令
字符串比较指令CMPSB/CMPSW
功能:
把DS段由SI所指的字节或者字和ES段由DI所指的字节或者字相比较。
设置标志位
CMPSB/CMPSW指令注意点:
①预先将:
源字符串的首址设置到DS段和SI中目的字符串的首址设置到ES段和DI中
比较的字节数或字数设置到CX中设置方向标志
②在DF为0或为1,影响比较SI和DI的修改方向。
③CMPSB/CMPSW指令通常加前缀REPNZ/REPNEREPZ/REPE
3.字符串检索指令
SCASB或者SCASW功能:
将AL中的字节或者AX中的字与位于ES段由DI寄存器所指的内存单元的字节或字相比较。
4.取字符串指令
LODSB/LODSW功能:
将位于DS段由SI所指的存储单元的内容取到AL或AX中。
LODSW取字,DF=1时地址作减量修改DF=0时地址作增量修改
5.存字符串指令
STOSB/STOSW功能:
把AL或AX中的数据存到ES段DI寄存器所指的内存单元。
3.1.15控制转移指令
控制转移指令中包括5类指令,即
子程序调用和返回指令无条件转移和条件转移指令循环控制指令中断指令处理器控制指令
关于转移指令和调用指令的寻址
段内直接转移;段内间接转移;段间直接转移;段间间接转移
1子程序调用和返回指令
子程序调用指令:
●段内直接调用指令
●段内间接调用指令
●段间直接调用指令
●段间间接调用指令。
例:
CALL1000H;段内调用地址在指令中给出
CALLAX;段内间接调用地址由AX给出
CALL2500H:
3600H;段间直接调用,段地址;和偏移量由指令给出
CALLDWORDPTR〔DI〕;段间间接调用,调用;地址在DI、DI+1、;DI+2、DI+3所指单元
RET
功能:
返回高一层的程序。
特点:
可带参数
RETnn为0~FFFFH范围中的偶数。
2无条件转移指令和条件转移指令
(1)无条件转移指令有四种形式
如:
JMP1000H
JMPCX
JMP2000H:
0100H
JMPDWORDPTR〔ST〕
条件转移指令特点:
都是相对转移形式的根据比较结果决定是否转移大部分转移指令有两种不同的助记符
(2)条件转移指令的形式:
JE/JZ;结果为0,则转移
JNE/JNZ;结果不为0,则转移
JG/JNLE;大于不小于且不等于则转移
JNG/JLE;不大于即小于或等于则转移
JL/JNGE;小于,即不大于且不等于则转移
JNL/JGE;不小于,即大于或者等于则转移
JB/JNAE;低于,即不高于且不等于则转移
JNB/JAE;不低于,即高于或者等于则转移
JA/JNBE;高于,即不低于且不等于则转移
JNA/JBE;不高于,即低于或者等于则转移
JS;符号标志SF为1则转移
JNS;符号标志SF为0则转移
JO;溢出标志OF为1则转移
JNO;溢出标志OF为0则转移
JP;奇偶标志PF为1则转移
JNP;奇偶标志PF为0则转移
3循环控制指令
(1)LOOP指令
功能:
将CX的内容减1,CX如不为0,则继续循环,为0,则退出循环。
如:
MOVCX,0100H;设置循环次数
KKK:
LOOPKKK;CX减1,如不为0则循环
(2)LOOPZ/LOOPE
功能:
将CX减1,如CX为0或者ZF为0则退出循环,在ZF=1且CX≠0时继续循环。
注意:
CX中的值为0时,并不会影响标志位ZF。
(3)LOOPNZ/LOOPNE
CX减1,如CX≠0且ZF=0,则继续循环;如CX=0,或ZF=1,则退出循环。
4中断指令和中断返回指令
软件中断指令INTn中断返回指令IRET
五个内部中断:
类型为0的中断——除数为0的中断
类型为1的中断——单步中断
类型为2的中断——非屏蔽中断NMI。
类型为3的中断——断点中断
类型为4的中断——溢出中断
5处理器控制指令
1)暂停指令HLT功能:
CS和IP指向HLT后面的一条指令的地址,而CPU暂停工作
(2)标志操作指令
STC、CLC和CMCSTD和CLDSTI和CLI
3)交权指令和等待指令
交权指令ESC:
CPU调用协处理器工作。
等待指令WAIT:
CPU测试TEST引脚上的信号,直到有停止信号为止。
(4)总线封锁指令LOCK功能:
对总线实行封锁。
3.2Pentium的寻址方式
具有8086的全部寻址方式
1.立即寻址指令所需要的一部分操作数就包含在指令中。
MOVAL,80H
MOVAX,1090H
MOVEBX,12345678H
注意:
(1)立即数——源操作数
(2)一般用于给寄存器赋值(3)寄存器可以使用32位的寄存器EAX,EBX,ECX,EDX
2.寄存器寻址操作数在寄存器中,或者操作结果存放在寄存器中。
INCCX
ROLAH,1
MOVECX,EAX
MOVEDX,87654321H
3.IO端口寻址
CPU与外部设备交换数据
(1)I/O直接寻址
INAL,80H
OUT60H,AX
INEAX,70H
(2)I/O间接寻址
INAL,DX
OUTDX,AX
OUTDX,EAX
操作数在存储器的寻址
指令中给出的是一个段内偏移地址。
它又叫做有效地址,用符号EA表示。
线性地址=段基地址+EA
段基地址的获取与Pentium的工作方式有关
(1)在实模式下——从段寄存器获得
(2)在保护模式下——段寄存器作为段选择子,它从特定的描述符表中选择一个段描述符——段描述符中存放32位的段基地址。
4.直接寻址
操作数在内存中,指令直接给出存储器的地址(偏移值)。
比如:
MOVAX,[1070H]
MOVEAX,ES:
[1000H]
注意:
段基地址的获取与运行方式有关
(1)在实模式下,与8086一样,段基地址通过段寄存器获得
(2)在保护模式下,段基地址通过段描述符获得,
线性地址=段基地址+偏移地址偏移地址又叫做有效地址EA
5.寄存器间接寻址
操作数在内存中,指令中给出的是存放存储器地址的寄存器名,寄存器的内容才是存储器的地址。
MOVAX,[BX]
MOVEAX,[EBX]
6.寄存器相对寻址
操作数存放在存储器中。
指令给出存放操作数地址的寄存器,以及一个常数偏移量,存储器的有效地址为该寄存器的内容+给定的常数偏移量。
比如:
MOVAX,[SI+100H]
常数:
可以是8位,16位,32位带符号数。
7.基址+变址寻址
操作数存放在存储器中。
指令中给出:
基地址寄存器、变址寄存器
存储器的地址:
(基址寄存器)+(变址寄存器)
基址寄存器:
EBX、EBP、BX、BP
变址寄存器:
ESI、EDI、SI、DI
MOVAX,[BX+SI]
MOVEDX,[EBX+ESI]
MOVEDX,[EBX][ESI]
8相对的基址+变址寻址
在基址+变址的基础上,增加一个常数偏移量。
例如:
MOVAX,[BP+SI+0050]
新增的寻址方式
3种。
在
变址寻址基址+变址寻址相对的基址+变址寻址
的基础上,对变址寄存器增加了一个比例因子
9.相对的带比例因子的变址寻址
IMULEBX,[ESI*4+7]
10基址+比例因子的变址寻址
MOVEAX,[EBX][ESI*4]
MOVECX,[EDI*8][EAX]
11相对的基址+比例因子的变址寻址
MOVEAX,[EDI*4][EBP+80]
3.3Pentium指令系统
Pentium的指令分为如下几类:
–传送指令;
–串操作指令;
–算术运算指令;
–逻辑运算和移位指令;
–转移和调用指令;
–标志操作和处理器指令;
–控制指令;
–条件测试和字节设置指令;
–系统管理指令;
–支持高级语言的指令。
3.2.1传送指令
包括
●通用数据传送指令
●堆栈操作指令
●交换指令
●输入/输出指令
●换码指令
●地址传送指令
●标志位传送指令
1.通用传送指令
将源操作数传送到目的操作数。
注意以下几点:
(1)可以是8位、16位、32位,具体有寄存器字长确定,或由存储器的字长前最符约定
(2)目的操作数不能是立即数、CS、IP、EIP
(3)源操作数可以是任何寻址方式的操作数
(4)两个内存单元之间不能直接传送
(5)段寄存器之间不能直接传送
(6)注意默认的段寄存器,
BX、SI、DI、EBX、ESI、EDI——DS
BP、EBP、SP——SS
(7)对SS的赋值指令自动关闭中断。
传送完毕又自动恢复执行该指令前的中断开放状态
(8)通用数据传送指令不改变标志位。
(1)两个操作数的数位相同的传送指令MOV
MOVAL,BL
MOVES,DX
MOVAX,[BX]
MOV[DI],AX
MOVCX,[1000]
MOVWORDPTR[SI],6070H
MOVDX,5040H
MOVEAX,[EBX+ECX*2+1000H]
MOVCRn,EAX
MOVDRn,EAX
(2)两个操作数的数位不相同的传送指令MOVZX/MOVSX
MOVZXEAX,BL;0扩充
MOVSXEAX,BL;符号扩充
2.堆栈操作指令
(1)普通堆栈操作指令PUSH/POP
①压栈指令
PUSHEAX
PUSHCS
PUSH[BX+DI]
PUSH0870H
PUSHDWORDPTR[EBX+ESI]
②弹出指令
POPBX
POPES
POPEAX
(2)堆栈成组操作指令
PUSHA——将8个16位寄存器(AX,CX,DX,BX,SP,BP,SI,DI)按顺序压入堆栈。
PUSHAD——将8个32位寄存器(EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI)按顺序压入堆栈。
注:
压入堆栈中的SP(ESP)的内容是执行该指令前的SP(ESP)的值。
POPA——成组弹出8个16位寄存器,顺序与PUSHA相反
POPAD——成组弹出8个32位寄存器,顺序与PUSHAD相反
每推入一个字,SP-2,低字节在低地址。
在中断服务程序、子程序中保护现场是用压栈方式将寄存器的内容压入堆栈,而在中断返回、子程序返回前,再将被压入的值送回对应的寄存器——恢复现场。
PUSHEAX
PUSHEBX
PUSHEDI
PUSHESI
则子程序返回前,应如下恢复寄存器的值:
POPESI
POPEDI
POPEBX
POPEAX
3.交换指令XCHG/BSWAP
(1)字节、字和双字交换指令XCHG
XCHGAL,BL
XCHGBX,CX
XCHG[2530],CX
XCHGEAX,EDI
XCHGESI,[EBX]
(2)BSWAP
寄存器内部双字交换指令。
4个字节交换。
四个字节——最高字节最低字节,次高字节次低字节
例如:
[EAX]=01234567H,执行指令BSWAPEAX,使
[EAX]=67452301H
4输入/输出指令IN/OUT
(1)直接的I/O指令比如:
INAL,50H
INAX,70H
INEAX,70H
OUT80H,AX
(2)间接的I/O指令
INAL,DX
INAX,DX
INEAX,DX
OUTDX,AX
OUTDX,EAX
5换码指令
实际上是查表。
在内存中有一个数据表,换码指令就是从内存表中,取出与表基地址相距=累加器AL内容的值累加器AL。
(1)XLAT
BX内容为表首地址,AL为偏移量
(2)XLATB
EBX内容为表首地址,AL为偏移量
指令执行完毕,AL内容改变。
教材上给出了一个例——BCD格雷码转换
格雷码编码规则如下:
0——110001——00011
2——001013——00110
4——010015——01010
6——011007——10001
8——100109——10100
格雷码表首地址:
10000H
MOVBX,1000H
MOVAL,05H
XTAL
程序执行后,(AL)=00001010B
6地址传送指令
(1)取有效地址指令LEA——将内存的有效地址送目的寄存器。
比如:
LEAAX,[2728];(AX)=2728
LEABX,[BP+SI]
LEAESI,[EBX+ECX+2530H]
LEAEDI,[BX+1946H]
注意:
是有效地址,而不是该地址存放的内容送目的寄存器。
(2)取段码和偏移量的指令
LDS/LES/LSS/LFS/LGS
将内存的段码和偏移量分别送两个寄存器,
比如:
LDSDI,[2530H];段码送DS,偏移量送DI
LESEDI,[1000H];段码送ES,偏移量送EDI
LSSESP,[EDX];段码送SS,偏移量送ESP
LFSEDX,[EDX];段码送FS,偏移量送EDX
LGSESI,[EDX];段码送GS,偏移量送ESI
注:
(1)目的寄存器存放偏移量有,传送的字节数与寄存器长度匹配;(2)段寄存器由指令操作符确定
7标志传送指令
标志传送指令
功能:
读出标志寄存器的内容,对其进行修改,写回标志寄存器
标志寄存器比较重要,不能随意改写,为避免误写造成错误,故用特殊方法、特殊指令。
(1)读取和设置标志寄存器低8位
LAHF——将标志寄存器低8位AH
在AH中可以按需要修改
SAHF——将AH内容写入标志寄存器低8位
修改好后,再写回。
(2)标志寄存器压栈与弹出
PUSHF——16位标志寄存器压栈
POPF——弹出16位到标志寄存器
PUSHFD——32位标志寄存器压栈
POPFD——弹出4字节到标志寄存器
3.2.2算术运算指令
无符号数和有符号数采用同一套加法及减法指令有两个条件:
–同为无符号数或有符号数
–用不同的方法检测无符号数或有符号数的运算结果是否溢出
1加法类指令
(1)不带进位位的加法指令ADD
比如:
ADDCX,1000H
ADDDI,SI
ADD[BX+DI],AX
ADDEAX,[BX+2000H]
(2)带进位位的加法指令ADC
比如:
ADCAX,SI
ADCDX,[SI]
ADCBX,3000H
(3)字交换加法指令XADD
通过交换将目的操作数送入源操作数处
源操作数+目的操作数目的操作数
比如:
[AX]=1234H,[BX]=1111H,执行指令
XADDAX,BX
[AX]=2345,[BX]=1234
它与一般加法指令的区别?
比如:
[EAX]=20000002H,而1000H开始的内存单元中为30000003H,执行指令
XADD[1000H],EAX后
[1000H]=?
[EAX]=?
(4)增量指令INC
指令的功能:
比如:
INCAL
INCECX
INCBYTEPTR[BX+DI+500]
2减法类指令
(1)不考虑借位的减法指令SUB,比如:
SUBEBX,ECX
SUB[BP+2],CL
SUBSI,5010H
SUBWORDPTR[DI],1000H
(2)考虑借位的减法指令SBB
SBBAX,2530H
SBBWORDPTR[EDI+2],1000H
(3)减量指令DEC比如:
DECEBX
DECAX
DECBYTEPTR [DI+2]
(4)求补指令NEG比如:
NEGEAX
NEGECX
(5)比较指令CMP比如:
CMPAX,2000H
CMPEAX,[EBX+EDI+100]
CMPEDX,EDI
(6)比较并交换指令CMPXCHG
格式:
CMPXCHG目的操作数,源操作数
功能:
目的操作数与累加器比较,依据比较结果不同执行不同的传送操作
ZF=1(相等),源操作数送目的操作数
ZF=0(不等),目的操作数送累加器
比如:
[AL]=11H,[BL]=24H,[1000H]=22H,执行指令CMPXCHG[1000H],BL
又如:
[EBX]=76543210H,[ECX]=01234567H,[EAX]=01234567H,则执行指令CMPXCHGECX,EBX
7)8字节比较指令CMPXCHG8B
与(6)相似,只是他执行EDX:
EAX中8字节与存储器中的8个字节比较。
比如:
[EAX]=11111111H,[EBX]=22222222H,[ECX]=33333333H,[EDX]=44444444H,设DS段1000H所指单元开始的8字节为4444444411111111H,执行指令CMPXCHG8B[1000H]
3乘法指令MUL/IMUL
(1)无符号数的乘法指令MUL
MULCX
MULBYTEPTR[DI]
MULWORDPTR[SI]
(2)有符号数的乘法指令IMUL
IMULCL
IMULBX,100
IMULBYTEPTR[BX]
IMULWORDPTR[DI]
(3)有符号数乘法指令的扩充形式
第一组指令:
IMULBX,CX
IMULEDX,ECX
IMULDI,MEM_WORD
IMULEDX,MEM_DWORD
第二组指令:
IMULDX,BX,300
IMULCX,23
IMULEBP,200
IMULECX,EDX,2000
IMULBX,MEM_WORD,300
IMULEDX,MEM_DWORD,20
4除法指令
(1)无符号数的除法指令DIV
DIVCL
DIVWORDPTR[DI]
(2)有符号数的除法指令IDIV
IDIVBX
IDIVBYTEPTR[DI]
5类型转换指令
CBWCWDCWDECDQ
6BCD码相关指令
两类BCD码
–组合的BCD码
–非组合的BCD码
BCD码指令AAA/DAA、AAS/DAS、AAM和AAD
–BCD码的加法十进制调整指令AAA/DAA
–BCD码的减法十进制调整指令AAS/DAS
–BCD码的乘法十进制调整指令AAM
–BCD码的除法十进制调整指令AAD
3.2.3逻辑运算和移位指令
逻辑指令分为两类:
–逻辑运算指令
–移位指令
1.逻辑运算指令
逻辑运算指令AND/OR/NOT/XOR/TEST
比如:
ANDAX,1000H
ANDEAX,EBX
ANDEDX,[EBX+ESI]
ORAX,00F0H
XORAL,0FH
XOREAX,EAX
XORECX,100
XORECX,10000000H
TESTEAX,80000000H
TESTAL,01
NOTAL
NOTEBX
NOTWORDPTR[1000H]
2移位指令
1)非循环移位指令
SAL/SAR/SHL/SHR
SALEDX,8
SALEAX,CL
SALAL,1
可以用立即数给出移位次数(1~31),也可以
用CL给出。
操作数——8,16,32,可以数
寄存器,或存储器操作数