汇编语言指令集锦.docx
《汇编语言指令集锦.docx》由会员分享,可在线阅读,更多相关《汇编语言指令集锦.docx(16页珍藏版)》请在冰豆网上搜索。
汇编语言指令集锦
微处理器指令汇总
数据传送类指令
通用数据传送指令
MOVOPRD1,OPRD2;OPRD1←OPRD2/*r表示通用寄存器组中之一个寄存器*/
功能:
把源操作数送给目的操作数
语法:
MOV目的操作数,源操作数
格式:
MOVr1,r2
MOVr,m
MOVm,r
MOVr,data
注意:
OPRD1,OPRD2不能同时为内存操作数;
CS和IP不能做目的操作数;
所有的MOV指令都不改变标志位。
交换指令
XCHG
功能:
交换两个操作数的数据
语法:
XCHG
格式:
XCHGr1,r2XCHGr,m
堆栈操作以及标志寄存器传送指令
PUSH,POP
功能:
把操作数压入或取出堆栈
语法:
PUSH操作数POP操作数
格式:
PUSHrPUSHmPUSHdataPOPrPOPm
PUSHF,POPF,PUSHA,POPA
功能:
堆栈指令群
格式:
PUSHFPOPFPUSHAPOPA
LAHF(LoadAHfromFlags):
将FR中的低8位送到AH中。
SAHFSAHF(StoreAHintoFlags):
与LAHF相反,将AH→FR中的低8位。
PUSHF(PUSHFlags)将FR压入堆栈。
POPF(POPFlags)将栈顶内容弹出给FR。
功能:
标志寄存器内容的传送与弹出
格式:
LAHFSAHFPUSHFPOPF
地址传送指令
LEA,LDS,LES
功能:
取地址至寄存器
语法:
LEAreg,src;src代表地址偏移量(16位)。
LDSreg,mem;(DW)
将mem中的字装入到指定的reg中,跟在内存单元字后面的mem单元中的字装入到DS中。
LESreg,mem;(DW)将上述指令的DS换为ES即可。
累加器专用传送指令
表格查找
XLAT(XLATB)/*ac表示累加器(若是8位则为AL寄存器,16位则为AX寄存器)*/
功能:
查表指令/*DX和port指定I/O端口的地址*/
BX为表格起点,AL为索引值;从DS:
[BX+AL]中取一个字节送给AL。
语法:
XLATXLATm
输入指令
INac,DXINac,port
输出指令
OUTDX,acOUTport,ac
算术运算类指令注:
1.算术运算中的带符号数均用补码表示。
2.16进制运算为逢十六进一。
ADD,ADC(withcarry)
ADDOPRD1,OPRD2;OPRD1←OPRD1+OPRD2
ADCOPRD1,OPRD2;OPRD1←OPRD1+OPRD2+CF
功能:
加法指令
语法:
ADDOP1,OP2ADCOP1,OP2
格式:
ADDr1,r2ADDr,mADDm,rADDr,data
影响标志:
C,P,A,Z,S,O
SUB,SBB(withborrow)
SUBOPRD1,OPRD2;OPRD1←OPRD1-OPRD2
SBBOPRD1,OPRD2;OPRD1←OPRD1-OPRD2-CF
功能:
减法指令
语法:
SUBOP1,OP2SBBOP1,OP2
格式:
SUBr1,r2SUBr,mSUBm,rSUBr,dataSUBm,data
影响标志:
C,P,A,Z,S,O
INC,DEC
DECreg/mem;(B/W);reg/mem←reg/mem-1
INCOPRD;(8位或16位REG,MEM内容);reg/mem←reg/mem+1
功能:
把OP的值加一或减一
语法:
INCOPDECOP
格式:
INCr/mDECr/m
影响标志:
P,A,Z,S,O,不改变CF标志。
注意:
段寄存器不能用此指令加一或减一。
NEG
NEGreg/mem;reg/mem←0-reg/mem
功能:
将OPRD的符号反相(取二进制补码),通过0减去指定操作数来完成2进制的补码操作
语法:
NEGOPRD
格式:
NEGr/m
影响标志:
C,P,A,Z,S,O
MUL,IMUL
MULreg/mem;(B/W)
该指令只影响CF与OF,当乘积的高一半为0,则OF=CF=0;否则CF=OF=1.
IMULreg/mem;
与MUL相似,只是两操作数是符号数。
若OF=CF=0,则表示AH或DX中不是00就是FF,为积的低一半符号位的扩展。
若OF=CF=1,表示AH(orDX)内容是积的有效数字部分。
功能:
乘法指令
语法:
MULOPRDIMULOPRD
格式:
MULr/mIMULr/m
DIV,IDIV
功能:
除法指令
语法:
DIVmem/reg商余
DX|AX÷mem/reg(32位÷16位)→AX…DX
AX÷mem/reg(16位÷8位)→AL…AH
标志ZSAPCO不确定。
IDIVmem/reg商范围:
8位:
-128(80H)~+127(7FH)
16位:
-32768(8000H)~+32767(7FFFH)
若超出了这个范围,则会作为除数为0的情况来处理,即产生一个0号中断(不是按常规使OF=1)。
若8位÷8位,或16÷16时,被除数AH与DX做符号扩展。
格式:
DIVr/mIDIVr/m
CBW,CWD
功能:
有符号数扩展指令
语法:
CBW将AL之符号扩展到AH中
若AL<80H,则CBW后,AH←00;
若AL≥80H,则CBW后,AH←FFH;
此指令不影响标志位。
CWD扩展AX之符号到DX中
若AX<8000H,则CWD后,DX←0000;
若AX≥8000H,则CWD后,DX←FFFFH;
此指令不影响标志位。
BCD码运算指令
有两类BCD码:
一类叫组合的BCD码,即一个字节表示两个BCD码,如01000101表示45;
另一类叫非组合的BCD码,一个字节只用低4位表示一位BCD码,高4位为0,如00001000表示8。
AAA,AAS,AAM,AAD
功能:
非组合的BCD码运算调整指令
语法:
调整ASCII码加法结果指令
AAA(ASCIIAdjustforAddition)
对两个未组合的BCD码相加结果校正。
对ASCII码减法的结果进行调整指令
AAS(ASCIIAdjustforSubtraction)
对两个未组合的BCD码相减结果校正。
对未组合型BCD码乘法的结果进行调整
AAM(ASCIIAdjustforMultiplication)
被乘数和乘数都是用非组合的BCD码表示,两数相乘,其结果仍在AL中,对AL中的结果进行调整。
未组合BCD码除法运算调整
AAD(ASCIIAdjustforDivision)
对AX中两位未组合的BCD数在相除前校正。
例如:
MOVAX,0300H
MOVBL,05H;/*即AH0A+AL→AL*/
AAD;/*AX=001EH*/
DIVBL;/*AL=06H,余AH=00*/
影响标志:
A,C(AAA,AAS)S,Z,P(AAM,AAD)
DAA,DAS
功能:
压缩BCD码调整指令
语法:
相加之后对累加器的内容进行十进制调整指令(DecimalAdjustforAddition)
DAA
对两个组合(压缩)的BCD码相加结果校正。
两个BCD码相减之后对累加器的内容进行十进制调整指令(DecimalAdjustforSubtraction)
DAS
对两个组合(压缩)的BCD码相减结果校正。
调整只能在AL寄存器中进行。
比较指令
形式:
CMPOPRD1,OPRD2;OPRD1-OPRD2
不送回相减的结果,只影响标志位。
比较后源与目的操作数内容都不变。
♥当两数x,y为无符号数比较时,判断大小用CF标志:
若x-y,CF=0,x>y;
若x-y,CF=1,x若x-y,ZF=1,x=y。
♥当两数x,y为带符号数比较大小时,用OF异或SF判断大小:
若x-y后,SF=1,OF=1,则x>y;
SF=0,OF=0,则x>y;
即若SFOF=0,则x>y。
若x-y后,SF=1,OF=0或SF=0,OF=1,即若SFOF=1则x逻辑运算指令集
双操作数逻辑指令
注:
1.这四条指令执行后,标志CF=0,OF=0,标志SF,ZF,PF,根据逻辑操作结果置位,标志AF未定义。
2.这四条指令允许8位或16位操作。
AND,OR,XOR,TEST
功能:
执行BIT与BIT之间的逻辑运算
语法:
ANDr/m,r/m/dataORr/m,r/m/dataXORr/m,r/m/dataTESTr/m,r/m/data
注:
1.某一个操作数,自身和自身相“与”,操作数不变,但可使CF标志清零。
2.某一个操作数,自身和自身相“或”,操作数不变,但可使CF标志清零。
3.某一个操作数,自身和自身相“异或”,操作数清零,且可使CF标志清零。
这可用来使寄存器或内存单元初值置零。
4.TEST指令完成AND指令相同操作,但该指令不改变两操作数的值,结果只反映在标志位上。
影响标志:
C,O,P,Z,S(其中C与O两个标志会被设为0)
单操作数逻辑指令
求反指令
NOT(B/W)
功能:
将指定寄存器或储存单元的内容求反。
语法:
求反指令
NOTreg/mem(B/W)注:
对标志位无影响,不允许跟立即数。
移位指令
注:
这四条指令可进行8位或16位操作,每次可以只移一位,也可以由寄存器CL的值规定所移位数。
SHR,SHL,SAR,SAL
功能:
移位指令
语法:
SHRr/m,1/CLSHLr/m,1/CLSARr/m,1/CLSALr/m,1/CL
SAL(ShiftArithmeticLeft)
SHL(ShiftLogicLeft)
这两条指令在物理上完全相同,在移位次数为1时,若移位后,结果的最
高位与CF不相等,则OF=1.这用来表示移位以后的符号位与移位前是否相同。
标志位SF,ZF,PF根据移位结果置位,AF未定义。
SAR(ShiftArithmeticRight)
SAR每执行一次,操作数右移一位,最低位移至CF,但保持符号位不变。
指令影响标志位CF,ZF,PF,而SF,OF不改变。
SHR(ShiftLogicRight)
SHR指令每执行一次,也使操作数右移一位,最低位移至CF,最高位补零。
当移位次数为1时,若移位之后,结果的最高位与次高位不同,则OF=1.
※注:
只有SAR不改变SF和OF.
循环移位指令
注:
这四条指令只影响CF与OF。
ROR,ROL,RCR,RCL
功能:
循环移位指令
语法:
RORr/m,1/CLROLr/m,1/CLRCRr/m,1/CLRCLr/m,1/CL
ROL(RotateLeft)
当循环移位位数为1时,若循环移位后结果的最高位不等于
CF,则OF=1.
ROR(RotateRight)
当循环移位位数为1时,若循环移位后结果的最高位不等于
次高位,则OF=1.
RCL(RotatethroughCFLeft)
当循环移位位数为1时,若循环移位后结果的最高位不等于
CF,则OF=1.
RCR(RotatethroughCFRight)
当循环移位位数为1时,若循环移位后结果的最高位不等于
次高位,则OF=1.
注:
二进制左移一位,相当于原数乘2,右移一位相当于原数除2.
程序流程控制指令集
无条件转移指令
JMP
功能:
跳往指定地址执行
语法:
JMPaddr/disp/disp16/mem/reg
与CALL一样,可用NEAR或FAR表示段内或段间转移。
但JMP不要求返回,且对标志位无影响。
条件转移指令
注:
这些指令对标志位无影响,转移的位移量为-128(80H)~+127(7FH)。
条件转移指令归纳起来可分为两类:
a.根据单个标志的条件转移指令;
b.根据若干标志位的逻辑组合的转移指令。
JXX(xx为条件)
功能:
当特定条件成立则跳往指定地址执行
语法:
JXX地址
注:
xx的内容既跳转的条件如下:
N:
NOT(相反条件),需和其它符号配合使用
E:
EQUAL,当ZF=1时成立
CF与ZF同时为1无意义。
若干标志位逻辑组合的条件转移指令
判断无符号数的大小
A:
ABOVE,当CF=0,ZF=0时成立,CFORZF=0.
B:
BELOW,当CF=1时成立
NA:
NOTABOVE,当CFXORZF=1时成立
注:
A=N(BE),BE=NA.
判断带符号数的大小
G:
GREATER(大于),当ZF=0且SFOF=0时成立
NG:
NOTGREATER(不大于),当ZF=1或SFOF=1时成立
L:
LESS(小于),当ZF=0且SFOF=1时成立
NL:
NOTLESS(不小于),当ZF=1或SFOF=0时成立
注:
G=NLE,GE=NL,L=NGE,LE=NG.
根据单个标志位的条件转移指令
O:
OVERFLOW,OF=1时成立
NO:
NOTOVERFLOW,OF=0时成立
C:
CARRY,当CF=1时成立
NC:
NOTCARRY,当CF=0时成立
注:
C=NAE=B,NC=NB=AE.
P:
PARITY,PF=1时成立
PE:
PARITYEVEN,PF=1时成立
NP:
NOTPARITY,PF=0时成立
PO:
PARITYODD,PF=0时成立
注:
P=PE,NP=PO.
S:
SIGN,SF=1时成立
NS:
NOTSIGN,SF=0时成立
Z:
ZERO,ZF=1时成立
NZ:
NOTZERO,ZF=0时成立
注:
Z=E,NZ=NE.
调用指令
格式:
CALLaddr;直接给出调用地址;
CALLdisp16;直接给出调用地址16位偏移量;
CALLreg/mem;通过reg或mem给出地址;
返回指令
格式:
RET;段内返回,栈针SP+2;
RETF;段间返回,栈针SP+4;
RETdisp16;SP+2之后再加disp16;
RETFdisp16;SP+4之后再加disp16;可允许用户废除一些在执行CALL之前入栈的参数。
循环指令
注:
循环控制指令共有4条,这些指令在循环的头部或尾部确定是否进行循环,范围为+127~-128之间,对完成串操作十分有用。
这些指令对标志位无影响。
1.LOOPdisp;
CX←CX-1,若CX≠0,则转至目标地址;在使用LOOP之前,需把循环次数置于CX中。
2.LOOPE/LOOPZdisp;
CX←CX-1,若CX≠0且ZF=1则转至目标地址。
3.LOOPNE/LOOPNZdisp;
CX←CX-1,若CX≠0且ZF=0则转至目标地址。
4.JCXZdisp;
JCXZ(JumpifCXregisterisZero)
当CX=0时,转移到该循环以外的指令,即跳出该循环;CX≠0则不转移。
为了能跳出循环,只要在开始处置CX=0即可,该指令不改变CX的值。
中断控制指令
1.软中断指令:
INTn(INTerrupt)
n为中断矢量号,n可以是0~255(00~FF)类型号,n×4(地址)中存放着中断服务入口地址IP值,n×4+2中存放着中断服务入口地址的CS值,有了中断服务程序的入口地址,就可以转入中断服务程序。
该指令执行如下操作:
♥将FR压入堆栈;
♥清除IF和TF标志,即置IF=TF=0;
♥将断点地址CS压入栈内;
♥将中断服务程序入口地址的代码段地址装入CS中(从内存地址n×4+2中取内容);
♥将断点地址IP压入栈内;
♥将中断服务程序入口地址的偏移量装入IP中(从内存地址n×4中取内容)。
2.INTO(INTerruptonOverflow)
该指令可写在一条算术运算指令的后面,若算术运算结果产生溢出,即OF=1,则INTO启动一个中断过程。
INTO的中断向量号为4.
例如:
INT4(INTO)
n×4=16D=10H,n×4+2=18D=12H,
则00010H,00011H存放IP值,00012H,00013H存放CS值。
3.中断返回指令:
IRET(InterruptRETurn)
从中断返回,中断服务程序的最后一条指令是IRET;把栈中的断点地址CS:
IP及FR弹出送到CS,IP和FR,返回中断时的断点处。
该指令对所有标志位都有影响。
字符串操作指令集
8086CPU有5种字符串操作指令:
MOVS,LODS,STOS,CMPS,SCAS
先介绍一下它们的共性:
⊙全部为1字节指令;
⊙用SI寻址源操作数(默认段为DS);
⊙用DI寻址目的操作数(默认段为ES);
⊙用CX做计数器;
⊙地址修改取决于DF,若DF=0,则地址增量(加1或2),DF=1,则地址减量(减1或2);
⊙串操作指令的前面可以加上重复操作前缀REP,于是指令重复执行,直到CX的操作次数满足要求为止。
字符串传送(MOVeString)
MOVS,MOVSB,MOVSW
功能:
字符串传送指令
语法:
MOVSMOVSBMOVSW
标志位:
无影响
字符串比较(CoMPareString)
CMPSB,CMPSW,CMPS
功能:
字符串比较指令
语法:
CMPSBCMPSWCMPS
CMPSB/CMPSW;[SI]-[DI],置FR,存储单元的内容均不变。
可用来检查两个字符串(数据块)是否相等。
1.若找相等的字符,加前缀REPE或REPZ,可解释为“当块未结束(CX≠0)且字符是相等的(ZF=1),
继续比较。
”
2.若找不等的字符,加前缀REPNE或REPNZ,则可解释为“串未结束(CX≠0)且字符不等(ZF=0),继续比较。
”
标志位:
C,P,Z,S,O
字符串搜索(SCAnString)
SCASB,SCASW,SCAS
功能:
字符串搜索指令
语法:
SCASBSCASWSCAS
AL/(AX)-ES:
[DI],改变FR,在数据块中找KEY(关键字)。
不改变目的串元素及累加器的值。
DI的值同时修改,是增是减决定于DF标志。
1.可加重复前缀REPE/REPZ,“当串未结束(CX≠0)且串元素等于搜索值(ZF=1),继续搜索。
”
2.也可加重复前缀REPNE/REPNZ,,“当串未结束(CX≠0)且ZF=0,继续搜索。
”
标志位:
C,P,Z,S,O
字符串装入与填充(LoaD/STOreString)
LODSB,LODSW,STOSB,STOSW
功能:
字符串载入或存贮指令
语法:
LODSBLODSWSTOSBSTOSW
LODSB/LODSW;AL/AX←DS:
[SI]并修改SI。
该指令对标志位无影响。
使用REP没意义(可用来统计正、负、0的个数,大小写字母等)。
STOSB/STOSW;AL/AX→ES:
[DI]并修改DI。
DI的增减取决于DF标志位,该指令对标志位无影响。
可加REP,在内存中填充一串相同的数据,如清0。
标志位:
无影响
字符串重复操作前缀
REP,REPE,REPZ,REPNE,REPNZ
功能:
重复前缀指令集
CPU控制指令集
标志位操作指令(FlagOperations)
注:
下述7条指令均为1字节指令,除了对指定的标志进行操作外,对其他标志位无影响。
♥进位标志清0:
CLC(CLearCarryflag);CF←0;
♥进位标志置1:
STC(SeTCarryflag);CF←1;
♥进位标志取反:
CMC(CoMplementCarryflag);CF←
;(complement)
♥方向标志清0:
CLD(CLearDirectionflag);DF←0;
♥方向标志置1:
STD(SeTDirectionflag);DF←1;
♥中断标志清0:
CLI(ClearInterruptflag);IF←0(禁止、屏蔽INTR线上的中断);
♥进位标志置1:
STI(SeTInterruptflag);IF←1(允许INTR线上中断)
空操作
NOP(No-OPeration)
此指令使CPU不进行任何操作,等待4个T(一个机器周期)。
用于精确定时或在源程序中插入指令。
处理器暂停
HLT(processorHaLT)
使CPU进入暂停状态,CPU不进行任何操作,也不影响FR。
当CPU处于HLT时,只有下面三种情况之一发生时,CPU才能脱离暂停状态:
1.在RESET线上有复位信号;
2.在NMI上有请求(当没有总线请求时);
3.在IF=1时,INTR线上有请求。
处理器等待
WAIT(processorWAIT)
与8087配合使用。
该指令用于等待8087协处理器的运行结果。
处理器交权
ESC(processorESCape)
ESCmem;将指定的存储单元内容送到数据BUS上,使其它外部处理器共享8086的程序与数据。
总线锁定前缀
LOCK(LOCKbusduringnextinstruction)
LOCK指令是一条一字节的前缀,可放在任何指令前面。
其功能是在下一条指令执行时锁定总线,使别的主设备暂时不能控制BUS。
低电平的LOCK信号一直要持续到下一条指令执行完。
各标志位的缩写与原文
•OV:
OVerflowNV:
Non-oVerflowOF
•DN:
DowNUP:
UPDF
•EI:
EnableInterruptDI:
DisableInterruptIF
•NG:
NeGativePL:
PlusSF
•ZR:
ZeRoNZ:
Non-ZeroZF
•AC:
AccessoryCarryNA:
Non-AccessoryAF
•PE:
ParityEvenPO:
ParityOddPF
•CY:
CarrYNC:
Non-CarryCF