一、数据传送指令
1、数据传送指令MOV
- 语句格式:MOV OPD,OPS
- 功能:将源操作数传入目的地址,源地址内容不变。即(OPS)-->OPD
注意:
- MOV指令不改变源操作数内容,不影响标志位。
- 源操作数和目的操作数应该有相同的类型,即必须同为字节型或字型。
- 代码段寄存器CS不能用作目的操作数,即不允许给CS赋值
- 立即数不能用作目的操作数,立即数也不能直接传送数据给段寄存器
- 源操作数和目的操作数不能同时为存储单元操作数
- 不允许在段寄存器之间直接传送数据
2、进栈指令PUSH
- 语句格式:PUSH SRC
- 功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2。
即:(SP)-2 --> SP
3、出栈指令POP
- 语句格式:POP OPD
- 功能:将栈顶元素弹出送至某一寄存器、段寄存器(CS除外)或存储器,堆栈指针加2。
4、数据交换指令XCHG
- 语句格式:XCHG OPR1,OPR2
- 功能:将源地址与目的地址中的内容互换。
5、累加器专用传送指令:输入指令IN/输出指令OUT
- 输入指令用来从指定的外设寄存器取信息送入累加器。
- 此指令实现I/O端口与CPU之间的数据传送。
- 输入指令 IN acc,PORT/DX
- 输出指令 OUT PORT/DX,acc
- 指令采用两种寻址方式:
- 直接寻址:在指令中直接给出端口的8位地址,因此可寻址256个端口
- 间接寻址:在指令中用寄存器DX给出端口的16位地址,因此可寻址65536个端口
- 用输入指令完成从输入端口到CPU的数据传送
- 用输出指令完成从CPU到输出端口的数据传送
注意:
- 输入/输出指令只能使用累加器AL或AX接收或发送数据。
- 使用短格式指令,必须将端口地址放入寄存器DX中。
- 输入/输出指令不影响标志位
6、地址传送指令
1、有效地址传送指令LEA
- 格式:LEA OPD,OPS
- 功能:主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。
- 补充:以下两条语句等效
- MOV BX,OFFSET NUM;将NUM的偏移地址送入BX中
- LEA BX,NUM ;将NUM的偏移地址送入BX中
2、指针送寄存器和DS指令LDS
- 格式:LDS OPD , OPS
- 功能:将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器。
- 即(OPS)--> OPD,(OPS+2)-->DS
3、指针送寄存器和附加数据段ES指令LES
- 格式:LES OPD,OPS
- 功能:将主存某字节单元内容送指定寄存器,下一字单元数据送ES寄存。
- 即(OPS)-->OPD,(OPS+2)--> ES。
二、算术运算指令
1、加法指令ADD、带进位加指令ADC
格式:ADD DST,SRC;
指令的功能是把源操作数的值加到目的操作数中。
根据结果设置FLAGS的OF,SF,ZF,AF,PF和CF标志位
- 格式:ADC DST,SRC;
- 指令的功能是把源操作数和进位标志位CF的值(0/1)一起加到目的操作数中
- 加1指令INC
- 格式:INC OPR;
- 功能:把操作数的值加1(不影响CF)
- 交换加指令XADD
- 格式:XADD oprd1,oprd2;
- 功能:交换两个操作数的值,再进行算术“加”法操作。
2、减法指令SUB
- 格式:SUB DST,SRC ;
- 功能:目的操作数(DST)减去源操作数(SRC)
- 影响六个状态标志,AF为半借位,CF为借位
带借位减SBB
- 格式:SBB DSI,SRC;
- 把源操作数和标志位CF的值从目的操作数中一起减去。
减1指令DEC
- 格式:DEC OPR;
- 把操作数的值减去1(不影响CF)
求补指令NEC
- 格式:NEC OPR;
- 功能:操作数= 0 - 操作数。
比较指令CMP
- 格式:CMP OPD,OPS
- 功能:目的操作数减源操作数,与SUB指令一样执行减法操作,但不回送相减结果,结果只影响标志位
- 即(OPD)-(OPS)。CMP指令通常用在选择结构程序中,其后紧跟着条件转移指令,用来根据比较结果转向不同的程序分支。
3、乘法指令MUL
无符号乘法指令MUL
- 格式:MUL src
- MUL为操作码助记符;src为源操作数(乘数),也可以是寄存器或存储单元,但不能使用立即数或段寄存器。
- 功能:两个无符号数相乘。
- 字节乘法:AX <--(AL)*(src)
- 字乘法:DX(高字),AX(低字)<--(AX)*(src)
- 注意:指令中只指定乘数,被乘数默认在寄存器AL或AX中。该指令只影响状态标志CF和OF,对其它标志位无定义。
有符号乘指令IMUL
- 格式:IMUL SRC
- 功能:
- 字节乘法:(AL)*(SRC)--> AX
- 字乘法:(AX)*(SRC)--> DX、AX
- IMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。
4、除法指令DIV
除法指令的被除数是隐含操作数,除数在指令中显式地写出来。
除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。
无符号除指令DIV
- 格式:DIV OPS;
- 功能:
- 字节除法:(AX)/(OPS)--> AL(商)、AH(余数)
- 字除法:(DX、AX)/(OPS) --> AX(商)、DX(余数)
有符号除指令IDIV
- 格式:IDIV OPS;
- 功能:
- 字节除法:(AX)/(OPS)--> AL(商)、AH(余数)
- 字除法:(AD、AX)/(OPS)--> AX(商)、DX(余数)
- 8086/8088规定IDIV指令运算结果余数的符号与被除数相同。
- 除法指令DIV和IDIV虽然对标志位的影响未定义,但可产生溢出
字节转换成字指令CBM
- 格式:CBM
- 功能:将AL中的符号位数据扩展至AH(补0)。
字转换为双子指令CWD
- 格式:CWD
- 功能:将AX中数的符号扩展到DX中。若AX中的数为正数,则(DX)=0000,否则(DX)=0FFFFH
5、十进制调整指令BCD码
- BCD码是一种用二进制编码的十进制数,又称二一十进制数。
- ...略*
三、逻辑运算和移位指令
1、逻辑指令
逻辑指令对字节或字数据进行按位的运算操作。
- 逻辑与:AND DST,SRT;-->(DST)
设置CF=OF=0,影响SF、ZF、PF、对AF无定义- 逻辑或:OR DST,SRC;-->(DST);标志同上
- 逻辑非:NOT OPR;-->(OPR);不影响标志位
- 异或:XOR DST,SRC;-->(DST);标志同AND
- 测试:TEST OPR1,OPR2;运算与AND相同,但不保存结果,只根其特征置条件标志。
2、移位指令
移位指令从移位方向上分为左移或右移;从移位功能上可以分为算术逻辑移位或循环移位,前者是开环的;后者是闭环的;从位移次数上可以分为一次移位或多次移位。
逻辑左移指令SHL
- 格式:SHL OPD,1 或 SHL OPD, CL
- 功能:将OPD的内容向左移动指定的位数,最高位移入CF中,低位补0。
算术左移指令SAL
- 格式:SAL OPD,1 或 SAL OPD,CL
- 功能:其操作与逻辑左移指令SHL完全相同
逻辑右移指令SHR
- 格式:SHR OPU,1 或 SHR OPD , CL
- 功能:将OPD的内容向右移动指定的位数,最低位移入CF中,高位补0。
算术右移指令SAR
- 格式:SAR OPD,1 或 SAR OPD,CL
- 功能:将OPD的内容向右移动指定的位数,最低位移入CF中,最高位保持不变。
循环左移指令ROL
- 格式:ROL OPD,1 或 ROL OPD,CL
- 功能:将OPD的内容向左移动指定的位数,最高位同时移入最低位和CF。
- 循环位移可以改变操作数中原有位的位置
循环右移指令ROR
- 格式:ROR OPD,1 或 ROR OPD,CL
- 功能:将OPD的内容向右移动指定的位数,最低位同时移入最高位和CF中。
带进位的循环左移指令RCL
- 格式:RCL OPD,1 或 RCL OPD,CL
- 功能:将OPD的内容连同CF标志一起向左循环所规定的位数。
四、串操作指令
为8086提供一组处理主存中连续存放数据串的指令
1、与REP相配合工作的MOVS,STOS和LODS指令
REP重复串操作
- REP前缀用在串传送指令MOVS、存入串指令STOS、从源串中取数指令LODS指令前
- 功能:每执行一次串指令(CX)-1,直到(CX)=0,重复执行结束。
- 例:REP MOVS
MOVS串传送指令
- 格式:
- MOVSB----字节串传送
- MOVSW----字串传送
- 功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中,并自动修改指针使之指向下一个字节(或字)存储单元。
存入串指令STOS
- 格式:
- STOSB----往字节串中存数
- STOSW----往字串中存数
- 功能:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。
- 即字节操作:(AL)--> [DI]
字操作:(AX)-->[DI]- 修改指针DI,使之指向串的下一个元素
从源串中取数指令LODS指令
- 格式:
- LODSB----从字节串中取数
- LODSW---从字串中取数
- 功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。
- 即:字节操作:([SI])-->AL,字操作:([SI])--> AX
修改指针SI,使它指向串中的下一个元素。- 当DF=0,(SI)增量。当DF=1时,(SI)减量。
2、与REPE/REPZ和REPNE/REPNZ联合工作的串比较指令CMPS和串扫描指令SCAS
REPE/REPZ
- 某次比较的结果两个操作数相等,或两个操作数相减为零时重复串操作
- 一般用在CMPS,SCAS指令前。
- 功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,则重复执行结束。
REPNE/REPNZ
- 某次比较的结果两个操作数不相等,或两个操作数相减不为零时重复串操作。
- 一般用在CMPS,SCAS指令前。
- 功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=1,则重复执行结束。
CMPS串比较指令
- 格式:
- CMPSB----字节串比较
- CMPSW---字串比较
- 功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元的数据相减,并根据相减结果设置标志,单结果不保存。
- 即:([SI])-([DI])
修改串指针,使之指向串中的下一个元素。串扫描指令SCAS
- 格式:
- SCASB---字节串搜索
- SCASW---字串搜索
- 功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存
- 即:字节操作:(AL])-([DI])字操作:(AX])-([DI])
修改串指针,使之指向串中的下一个元素。- 当DF=0,(DI)增量。当DF=1时,(D)减量。
五、控制转移指令
1、无条件转移指令
段内转移指令JMP
- 格式:
- 段内直接短转移:JMP SHORT OPR;(IP)<--(IP)+8位位移量
- 段内直接近转移; JMP NEAR PTR OPR;(IP)<--(IP)+16位位移量
- 段内间接转移: JMP WORD OPR;(IP)<--(EA),WORD、PTR是运算符
段间转移指令
- 格式:
- 段间直接(远)转移 JMP FAR PTR OPR; IP<--P[R的端内偏移地址,CS<-OPR的段地址
- 段间间接转移 JMP DWORD PTR OPR;IP<--(OPR)段内偏移地址,CS<--(OPR+2)
2、条件转移指令
条件转移指令将前一条指令执行结果对状态标志位的影响,作为程序转移的条件。满足条件时转移到指令指定的地址,否则将顺序执下条指令。可作为判断条件的状态标志位有CF、DF、ZF、SF和OF。
条件转移指令都是采用相对寻址方式的双子节指令,操作码+位移量。不影响状态标志。
测试寄存器CX的值为0转移指令
- 格式:
- JCXZ OPR: (CX)=0则转移
- 此指令在循环结构的程序中,将寄存器CX用作计数器,根据寄存器CX内容的修改情况实现二分支转移
3、循环控制指令
(1):LOOP OPR;(CX)不等于0 循环,否则顺序执行
(2):为零/相等循环:LOOPZ/LOOPE OPR;当ZF=1且(CX)不等于0则循环。反之
(3):不为零/不相等循环:LOOPNZ/LOOPNE;与上相反
注意:
- 使用循环控制指令之前,必须在寄存器CX(作为计数器)中预置循环次数的初值
- 执行循环控制指令时,将完成(IP)<--(IP)+8位位移量(符号位扩展到16位)的操作
- 循环控制指令不影响状态标志位。
- 循环控制指令主要用于数据比较、查找关键字等操作
六、处理器控制指令
1、子程序调用及返回指令
调用指令CALL:
- 段内直接调用CALL DST;(SP)<--(SP)-2
- 例:
- CALL 3000H:指令直接给出调用地址3000H
- CALL NEAR PTR SUBR;指令直接给出调用的“近”过程名SUBR
- :NEAR PTR是段内调用运算符。
- 段内间接调用CALL DST;
返回指令RET:
- 段内返回RET
2、中断指令
- 计算机程序运行期间遇到某些特殊情况时,需要CPU停止当前的程序,转去执行一组专门的程序,这种情况称为中断,这组程序称为中断服务程序。
- 8086中断分为外部中断和内部中断。外部中断通过外部设备接口向CPU的中断请求引脚发出请求,内部中断则由CPU执行中断指令而产生
- 中断指令:INT TYPE;
- 溢出中断指令:INTO;当运算结果溢出时OF=1并产生中断。
- 中断返回 IRET;
3、其它处理机控制指令
空操作指令NOP
- 格式:NOP
- 此指令为单字节指令,不执行任何操作,只起到占用存储器空间和时间延迟的作用。
- 处理器控制指令中,只有状态标志位操作指令影响指定的标志位,其他指令不影响。
停机指令HLT
- 格式:HLT
- 此指令可暂停计算机工作,使处理器处于停机状态,用于等待一次外部中断的产生,中断结束后,继续执行下面的程序。
等待指令WAIT
- 格式:WAIT
- 此指令使处理器处于等待状态,也可以用来等待外部中断发生,但中断结束后仍返回WAIT指令继续等待。本指令不允许使用立即数和寄存器寻址方式