汇编语言指令集锦.docx

上传人:b****6 文档编号:5371359 上传时间:2022-12-15 格式:DOCX 页数:16 大小:59.28KB
下载 相关 举报
汇编语言指令集锦.docx_第1页
第1页 / 共16页
汇编语言指令集锦.docx_第2页
第2页 / 共16页
汇编语言指令集锦.docx_第3页
第3页 / 共16页
汇编语言指令集锦.docx_第4页
第4页 / 共16页
汇编语言指令集锦.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

汇编语言指令集锦.docx

《汇编语言指令集锦.docx》由会员分享,可在线阅读,更多相关《汇编语言指令集锦.docx(16页珍藏版)》请在冰豆网上搜索。

汇编语言指令集锦.docx

汇编语言指令集锦

微处理器指令汇总

数据传送类指令

通用数据传送指令

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 生产经营管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1