目录
2、LDS、LES、LFS、LGS、LSS——地址指针送寄存器和相应段寄存器指令
一、数据传送指令
数据传送指令负责把数据、地址或立即数传送到寄存器或存储器中
数据传送指令包括通用数据传送指令、累加器专用传送指令、地址传送指令和标志寄存器传送指令。
(一)通用数据传送指令
通用数据传送指令又可分为以下指令:
通用数据传送指令 | |||||||
传送指令 | 带符号扩展传送指令 | 带零扩展传送指令 | 进栈指令 | 出栈指令 | 所有寄存器进栈指令 | 所有寄存器出栈指令 | 交换指令 |
MOV | MOVSX | MOVZX | PUSH | POP | PUSHA/PUSHAD | POPA/POPAD | XCHG |
注:MOVSX和MOVZX都是386以及其后继机型的指令系统,不做介绍。
1、MOV——传送指令
指令格式:
MOV DST,SRC ;执行操作:(DST) <- (SRC)
注:(1)DST不能是CS;
(2)不影响标志位
(3)DST,SRC不同时为段寄存器。如表所示:4个16位的段地址寄存器
4个16位的段地址寄存器 | |
CS | 代码段寄存器 |
DS | 数据段寄存器 |
SS | 堆栈段寄存器 |
ES | 辅助数据段寄存器 |
(4)立即数不能直接送段寄存器
2、PUSH——进栈指令和POP——出栈指令
PUSH——进栈指令指令格式:
PUSH SRC ;执行操作:(1) 16位指令:(SP) <-(SP)-2 即((SP)+1,(SP))<-(SRC)
;(2) 32位指令:(ESP) <-(ESP)-4 即((ESP)+3,(ESP)+2,(ESP)+1,(ESP))<-(SRC)
POP——出栈指令指令格式:
POP DST ;执行操作:(DST) <-((SP)+1,(SP)) (SP) <-(SP)+2
注:(1)堆栈:“先进后出”的存储区,存在于堆栈段中,SP在任何时候都指向栈顶
(2)堆栈操作必须以字为单位;
(3)不影响标志位
(4)不能用立即寻址方式
(5)DST为除立即数以及CS寄存器以外的任意数据寻址方式
3、所有寄存器进出栈指令
(1)PUSHA/PUSHAD——所有寄存器进栈指令
指令格式:PUSHA/PUSHAD
(2)POPA/POPAD——所有寄存器出栈指令
指令格式:POPA/POPAD
4、XCHG——交换指令
指令格式:
XCHG OPR1,OPR2 ;执行操作:(OPR1) <-(OPR2)
注:(1)不影响标志位;
(2)不允许使用段寄存器
(二)累加器专用传送指令
累加器专用传送指令只限于使用AX和AL.
累加器专用传送指令 | ||
输入指令 | 输出指令 | 换码指令 |
IN | OUT | XLAT |
都不影响标志位 |
1、IN——输入指令和OUT——输出指令
(1)IN——输入指令
长格式:
IN AL,PORT(字节) ;执行操作:(AL)<-(PORT)(字节)
IN AL,PORT(字) ;执行操作:(AX)<-(PORT+1,PORT)(字)
短格式:
IN AL,DX(字节) ;执行操作:(AL)<-((DX)(字节)
IN AL,DX(字) ;执行操作:(AX)<-((DX)+1,(DX))(字)
(2)OUT——输出指令
长格式:
OUT PORT,AL (字节) ;执行操作:(PORT)<-(AL)(字节)
OUT PORT,AL (字) ;执行操作:(PORT+1,PORT)<-(AX)(字)
短格式:
OUT DX,AL (字节) ;执行操作:((DX))<-(AL)(字节)
OUT DX,AL (字) ;执行操作:((DX)+1,(DX))<-(AX)(字)
注:(1)端口号>=256,端口号——>DX(短格式)
(2)前256个端口号00H~FFH可直接在指令中指定(长格式)
2、XLAT——换码指令
指令格式:XLAT或 XLAT OPR
执行操作:(AL)<-((BX)+(AL))
注:(1)字节表格长度不超过256,首地址->(BX)
(2)需转换代码->(AL)
(三)地址传送指令
1、LEA——有效地址送寄存器指令
指令格式:
LEA REG,SRC ;执行操作:(REG)<-SRC
注:不影响标志位
2、LDS、LES、LFS、LGS、LSS——地址指针送寄存器和相应段寄存器指令
指令格式:
LDS REG,SRC ;(REG)<-(SRC),(DS)<-(SRC+2)或(DS)<-(SRC+4)
注:不影响标志位
(四)标志寄存器传送指令
标志寄存器传送指令 | |||
标志送AH指令 | AH送标志寄存器指令 | 标志进栈指令 | 标志出栈指令 |
LAHF | SAHF | PUSHF/PUSHFD | POPF/POPFD |
(五)类型转换指令
类型转换指令 | |||
字节转换为字指令 | 字转换为双指令 | 双字节转换为4字指令 | 字节转换指令 |
CBW | CWD/CWDE | CDQ | BSWAP |
二、算术指令
算术指令是用来执行算术运算的指令。在80x86中主要有加法指令、减法指令、乘法指令、除法指令和十进制调整指令。
(一)加法指令
指令分类 | 指令格式 | 执行操作 |
加法指令 | ADD DST,SRC | (DST)<-(SRC)+(DST) |
带进位加法指令 | ADC DST,SRC | (DST)<-(SRC)+(DST)+CF |
加1指令 | INC OPR | (OPR)<-(OPR)+1 |
注:(1)除INC指令不影响CF标志外,均对条件标志位有影响
(2)加法指令对条件标志位(CF/OF/ZF/SF)有影响。
SF | ZF | CF | OF |
1:结果为负;0:结果为正 | 结果为0,ZF=1;否则ZF=0 | 和的最高有效位有向高位的进位,CF=1;否则CF=0; | 两个操作数符号相同,而结果符号与之相反,OF=1;否则OF=0; |
CF位表示无符号数相加的溢出 | OF位表示带符号数相加的溢出 |
(二)减法指令
减法指令 | 指令格式 | 执行操作 |
减法指令SUB | SUB DST,SRC | (DST)<-(DST)-(SRC) |
带进位减法指令SBB | SBB DST,SRC | (DST)<-(DST)-(SRC)-CF |
减1指令DEC | DEC OPR | (OPR)<-(OPR)-1 |
求补指令NEG | NEG OPR | (OPR)<-0-(OPR) |
比较指令CMP | CMP OPR1,OPR2 | (OPR1)-(OPR2) |
比较并交换指令CMPXCHG | CMPXCHG DST,SRC | 累加器AC与DST比较,如果(AC)=(DST),则ZF<-1,(DST)<-(SRC);否则ZF<-0,(AC)<-(DST) |
(三)乘法指令
1、MUL——无符号乘法指令
指令格式:MUL SRC
执行操作:
字节操作:(AX)<-(AL)*(SRC)
字操作:(DX,AX)<-(AX)*(SRC)
对CF/OF的影响,当CF/OF=00时,乘积的高一般为零,当CF/OF=11时,乘积的高一般为1,
2、IMUL——带符号数乘法指令
指令格式:IMUL SRC
对CF/OF的影响,当CF/OF=00时,乘积的高一半是低一半的符号扩展。
注意:(1)AL(AX)为隐含的乘法寄存器
(2)AX(DX,AX)为隐含的乘积寄存器
(3)SRC不能为立即数
(4)除了CF和OF外,对条件标志位无定义
(四)除法指令
1、DIV——无符号除法指令
执行操作:
指令格式:DIV SRC
字节操作:(AL)<-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的余数。
字操作:(AX)<-(DX,AX)/(SRC)的商,(DX)<-(DX,AX)/(SRC)的余数。
2、IDIV——带符号数除法指令
指令格式:IDIV SRC
注意:(1)AL(AX)为隐含的商的寄存器
(2)AX(DX,AX)为隐含的被除数的寄存器
(3)SRC不能为立即数
(4)除了CF和OF外,对条件标志位无定义。