汇编语言程序设计-常用指令系统

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

常用指令系统80x86汇编语言指令的一般格式为:[标号:]指令助记符[操作数][;注释][]中的内容为可选项。例如:START:MOVAX,DATA;DATA送AX标号:符号地址,表示指令在内存中的位置。标号后应加冒号:。指令助记符:指令名称,是指令功能的英文缩写。操作数:指令要操作的数据或数据所在的地址。寄存器,常量,变量,表达式。注释:每行以分号“;”开头,汇编程序不处理。8086指令系统可以分为5组:(1)数据传送指令(2)算术运算指令(3)逻辑指令与移位指令(4)串操作指令(5)程序转移指令5.1数据传送指令通用数据传送指令累加器专用传送指令地址传送指令标志寄存器传送5.1.1通用数据传送指令MOV传送PUSH进栈POP出栈XCHG交换(1)MOV传送指令格式:MOVDST,SRC操作:(DST)←(SRC)DST表示目的操作数,SRC表示源操作数。功能:将源操作数传送到目的操作数。双操作数指令的规定源操作数与目的操作数的长度必须一致。源操作数与目的操作数不能同时为存储器。目的操作数不能为CS和IP,因为CS:IP是程序当前地址。目的操作数不可以是立即数。例5.1立即数与寄存器的传送MOVAH,89;十进制数MOVAX,2016H;十六进制数,后面加HMOVAX,0ABCDH;十六进制数,因非数字(0~9)开头,前面加0MOVAL,10001011B;二进制数,后面加BMOVAL,‘A’;字符‘A’的ASCII码是41H,相当于立即数以下指令是错误的:MOVAH,258;258超出8位(二进制)MOVAX,DH;两个操作数长度不一致例5.2在指令中说明内存单元的类型,以便操作数长度匹配。MOV[BX],AX以下指令是错误的:MOV[BX],0指令改写为:MOVBYTEPTR[BX],0MOVWORDPTR[BX],0例5.3段地址寄存器的传送MOVAX,DATA_SEGMOVDS,AX段地址寄存器须通过寄存器得到段地址,不能直接由符号地址、段寄存器、立即数得到。以下指令是错误的:MOVDS,DATA_SEG;段寄存器不接受符号地址MOVDS,ES;段寄存器之间不能直接传送MOVDS,1234;段寄存器不接受立即数MOVCS,AX;指令合法,但代码段寄存器不能赋值例5.4传送变量MOVBX,TABLE;假定TABLE是16位的变量把变量TABLE的值送给BX。以下指令是错误的:MOVBL,TABLE;TABLE是16位的变量,操作数长度不一致MOV[BX],TABLE;两个操作数不能同为内存单元例5.5传送地址MOVBX,OFFSETTABLEOFFSET为偏移地址属性操作符,通常是把变量TABLE的偏移地址送给BX。以下指令是错误的:MOVBL,OFFSETTABLE不管变量类型如何,其有效地址总是16位。(2)PUSH进栈指令格式:PUSHSRC操作:(SP)←(SP)-2((SP)+1,(SP))←(SRC)堆栈:后进先出内存区,以字为单位传送,SS:SP总是指向栈顶。(3)POP出栈指令格式:POPDST操作:(DST)←((SP)+1,(SP))(SP)←(SP)+2例5.6进栈和出栈MOVBX,1234HPUSHBXPOPAX例5.7在DEBUG下如下指令也是合法的:PUSH[2016];把地址为DS:[2016]的字送往栈顶(SS:SP所指内存)POP[2016];把栈顶(SS:SP所指内存)的字送往DS:[2016]的内存(4)XCHG交换指令格式:XCHGOPR1,OPR2操作:(OPR1)(OPR2)功能:把两个操作数互换位置。遵循双操作数指令的规定,但操作数不能为立即数。例5.8XCHGAX,BX;两个寄存器长度相等XCHGAX,[BX];AX要求[BX]也取字单元XCHGAX,VAR;VAR必须是字变量以下指令是错误的:XCHGAX,5;显然操作数不能为立即数XCHG[BX],VAR;操作数不能同为内存单元XCHGAX,BH;操作数长度要一致5.1.2累加器专用传送指令IN;从I/O端口输入OUT;向I/O端口输出XLAT;换码其中I/O端口是CPU与外设传送数据的接口,单独编址,不属于内存,端口地址范围0000~FFFFH.这组指令只限于AX,AL累加器。(1)IN输入指令长格式:INAL,PORT(字节);00~FFHINAX,PORT(字)操作:AL←(PORT)AX←(PORT)功能:把端口PORT的数据输入到累加器。短格式:INAL,DX(字节);PORT放入DXINAX,DX(字)操作:AL←((DX))AX←((DX))功能:把DX指向的端口的数据输入到累加器。例5.9读端口INAX,61HMOVBX,AX把端口61H的16位数据输入到累加器AX,再转送BX。例5.10MOVDX,2F8HINAL,DX把端口2F8H的8位数据输入到累加器AL。INAX,2F8H;错,端口号超出8位,不能用长格式INAX,[DX];错,端口地址不能用[](2)OUT输出指令长格式:OUTPORT,AL(字节);00-FFHOUTPORT,AX(字)操作:PORT←ALPORT←AX功能:把累加器的数据输出到端口PORT。短格式:OUTDX,AL(字节);0000-FFFFHOUTDX,AX(字)操作:(DX)←AL(DX)←AX功能:把累加器的数据输出到DX指向的端口。例5.11写端口OUT61H,ALOUTDX,AL(3)XLAT换码指令格式:XLAT操作:AL←(BX+AL)功能:把BX+AL的值作为有效地址,取出其中的一个字节送AL。例5.12换码MOVAX,DATAMOVDS,AXMOVBX,100HMOVAL,4XLATINT21H•XLAT执行前•XLAT执行后5.1.3地址传送指令LEA有效地址送寄存器LDS指针送寄存器和DSLES指针送寄存器和ES(1)LEA有效地址送寄存器指令格式:LEAREG,SRC操作:REG←SRC功能:把源操作数的有效地址EA送到指定的寄存器。例5.13取变量的有效地址LEABX,TABLEMOVBX,OFFSETTABLE上面2条指令等效。TABLE无论是何类型的变量,其有效地址总是16位。例5.14LEABX,[2016H]MOVBX,OFFSET[2016H]指令执行后,BX=2000H。(2)LDS指针送寄存器和DS指令格式:LDSREG,SRC操作:REG←(SRC)DS←(SRC+2)功能:把源操作数SRC所指向的内存单元中的两个字送到指定的寄存器REG和DS。例5.15LDSSI,[BX]指令执行前,如DS=2000H,BX=0400H,(2000:0400)=1234H,(2000:0402)=5678H,指令执行后,SI=1234H,DS=5678H。(3)LES指针送寄存器和ES指令格式:LESREG,SRC操作:REG←(SRC)ES←(SRC+2)功能:把源操作数SRC所指向的内存单元中的两个字送到指定的寄存器REG和ES。例如LESDI,[10H]DS=C000H,(C0010H)=0180H,(C0012H)=2000H结果DI=0180H,ES=2000H5.1.4标志寄存器传送指令LAHF标志寄存器FLAGS的低字节送AHSAHFAH送FLAGS的低字节PUSHF标志进栈POPF标志出栈以上传送类指令均不影响标志位,除SAHF,POPF外.例5.16LAHF;标志寄存器低字节送AH寄存器SAHF;AH送标志寄存器PUSHF;标志入栈POPF;标志出栈5.2算术运算指令加减乘除四则运算是计算机经常进行的基本操作。算术运算指令主要实现二进制(和十进制)数据的四则运算。5.2.1类型扩展指令CBW:AL扩展为AXCWD:AX扩展为DX,AX扩展方法为符号扩展。例5.17正数的扩展MOVAL,52H;AL中的52H是正数CBW;指令执行后,AX=0052HCWD;指令执行后,DX=0000HAX=0052H例5.18负数的扩展MOVAL,88H;AL中的88H是负数CBW;指令执行后,AX=FF88HCWD;指令执行后,DX=FFFFHAX=FF88H5.2.2加法指令ADD加法ADC带进位加法INC加1(1)ADD加法指令格式:ADDDST,SRC操作:(DST)←(DST)+(SRC)例5.19无符号数的溢出标志位CFMOVAL,72HADDAL,93H例5.20有符号数的溢出标志位OFMOVAL,92HADDAL,93H溢出判断,以8位二进制数为例综上所述,CF=1为无符号数的溢出,OF=1为有符号数的溢出.OF位:若两个操作数的符号相同,而结果的符号与之相反时OF=1,否则OF=0。CF位:有进位/借位时CF=1,否则CF=0。(2)ADC带进位加法指令格式:ADCDST,SRC操作:(DST)←(DST)+(SRC)+CF例5.21用16位指令实现32位的双精度数的加法运算。设数A存放在目的操作数寄存器DX和AX,其中DX存放高位字。数B存放在寄存器BX和CX,其中BX存放高位字。如:DX=2000H,AX=8000HBX=4000H,CX=9000H指令序列为:ADDAX,CX;低位字加ADCDX,BX;高位字加第一条指令执行后,AX=1000H,CF=1,OF=1,此处OF=1不必在意。第二条指令执行后,DX=6001H,CF=0,OF=0,表示结果正常,无溢出。(3)INC加1指令格式:INCOPR操作:(OPR)←(OPR)+1除INC不影响CF,它们都影响条件标志位.条件标志位(条件码)最主要有:进位CF,零ZF,符号SF,溢出OF5.2.3减法指令SUB减法SBB带借位减法DEC减1NEG求补CMP比较(1)SUB减法指令格式:SUBDST,SRC操作:(DST)←(DST)-(SRC)(2)SBB带借位减法指令格式:SBBDST,SRC操作:(DST)←(DST)-(SRC)-CF(3)DEC减1指令格式:DECOPR操作:(OPR)←(OPR)-1(4)NEG求补指令格式:NEGOPR操作:(OPR)←-(OPR)功能:对OPR求补,求-OPR,即反码+1.只有OPR为0时,CF=0。(5)CMP比较指令格式:CMPOPR1,OPR2操作:(OPR1)-(OPR2)不回送结果,只产生标志位。CF=1为无符号数溢出,OF=1为有符号数溢出.例5.22考察减法中的标志位CF、OFMOVAL,72HSUBAL,93H例5.23用16位指令实现32位的双精度数的减法运算。设数A存放在目的操作数寄存器DX和AX,其中DX存放高位字。数B存放在寄存器BX和CX,其中BX存放高位字。如:DX=2001H,AX=8000HBX=2000H,CX=9000H指令序列为:SUBAX,CX;低位字减法SBBDX,BX;高位字减法第一条指令执行后,AX=F000H,CF=1,而对OF=0,ZF=0,SF=1,不必在意。第二条指令执行后,DX=0000H,CF=0,OF=0,表示结果正确。ZF=1,SF=0。例5.24考察NEG指令MOVAX,3NEGAXMOVDX,0NEGDX指令序列执行后,AX=FFFDH=-3(补码),DX=0H。可以看出,NEG指令实际上就是求数X的相反数,即求0-X,只有当X=0时,CF=0,其它情况CF=1。例5.25考察CMP指令MOVAX,5DECAXCMPAX,5指令序列执行后,AX=4,ZF=0,SF=1,CF=1,OF=0。CMP指令虽作减法,但不回送结果,只是产生标志位,为程序员比较两个数的大小提供判断依据。5.2.4乘法指令MUL无符号数乘法IMUL有符号数乘法(1)M

1 / 157
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功