汇编语言指令集锦.docx
- 文档编号:5371359
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:16
- 大小:59.28KB
汇编语言指令集锦.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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 指令 集锦