版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章8086/8088指令系统指令系统是微处理器(CPU)所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。在本章中主要讲解:8086/8088CPU的寻址方式以及指令系统,通过具体实例讲述各条指令的格式、功能、使用方法
。3.18086/8088的寻址方式操作码操作数汇编指令:操作码:指令操作类型;操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个:一个源操作数和一个目的操作数。[例]MOVAX,CX;将CX的内容送入AX中。寻址方式:在指令中为取得操作数所使用的方式首先介绍指令的格式:1、立即寻址方式指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中。立即数有8位和16位。[例]MOVAL,5;源操作数为立即寻址指令执行后,AL=05H,8位数据05H存入AL寄存器。[例]MOVAX,3064H;源操作数为立即寻址指令执行后,AX=3064H,16位数据3064H存入AX寄存器。2、寄存器寻址方式操作数是存放在寄存器中,指令中直接使用寄存器名,包括8位或16位通用寄存器、指针和变址寄存器、段寄存器。[例]MOVAX,CX;(AX)(CX)
DECAL;(AL)(AL)-13、内存寻址方式在内存寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地址EA(即偏移地址),段地址通常隐含在某个段寄存器中。1)直接寻址方式
直接寻址方式的操作数的形式为:Variable或[Variable]在直接寻址方式中,操作数的偏移地址(有效地址EA)直接用指令加以指定(有直接地址值和标号两种形式)。段地址隐含的由DS指定,也可以ES指定,但需在指令中指明。最后存储器地址为:DS:偏移地址或ES:偏移地址。[例]MOVAX,ES:[2000H]将ES:2000H单元内容送入AX。[例]MOVAX,LABLE或MOVAX,[LABEL]将标号为LABLE(存放操作数单元的符号地址),即DS:LABLE中的内容送入AX。2)寄存器间接寻址寄存器间接寻址方式的操作数形式为:[reg]操作数的有效地址包含在基址寄存器BX、基址指针BP或一个变址寄存器(SI或DI)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。[例]MOVAX,[BX];将由BX决定的存储单元的内容送到AX寄存器。0000000100020003BBAAMOV:AXAHAL
AABB间接寻址数据段0001BX操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。(BX)(SI)(DI)(BP)有效地址=
段寄存器为DS段寄存器为SS物理地址计算方法:物理地址=(DS)*16+(BX)或(SI)或(DI)物理地址=(SS)*16+(BP)[例]已知:(DS)=2100H,(DI)=2000H
指令:MOVAX,[DI],指令结果:AX=?存储器物理地址:22FFFH23000H23001H23002H23003H5BH7CH34H69H56H3)寄存器相对寻址方式操作数在存储器内,指令中寄存器内容与指令指定的位移量(DISP)之和作为操作数所在单元的有效地址。
(BX)
DISP8
(SI)
(DI)(BP)DISP16有效地址=
段寄存器为DS段寄存器为SS+[例]MOVAX,[BX+24]MOVAX,24[BX]MOVAX,COUNT[BP][例]如果(DS)=3000H,(SI)=2000H,COUNT=3000H,则执行指令MOVAX,CONUT[SI],求出此种寻址方式对应的有效地址和物理地址。4)基址加变址寻址方式操作数在存储器中,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)内容之和作为操作数所在存储单元的有效地址。有效地址=2000H+3000H=5000H物理地址=(DS)*16+5000H=30000H+5000H=35000H(BX)(SI)(BP)(DI)有效地址=+物理地址=(DS)*16+(BX)+(SI)/(DI)物理地址=(SS)*16+(BP)+(SI)/(DI)[例]MOVAX,[BX+DI]或MOVAX,[BX][DI]DS:BX+DI字存储单元内容送AX。[例]MOVAX,[BP+SI]或MOVAX,[BP][SI]SS:BP+SI字存储单元内容送AX。
段寄存器为DS段寄存器为SS[例]已知:(DS)=2100H,(BX)=0158H,(DI)=10A5H,[221FCH]=52H,[221FDH]=12H,[221FEH]=18H,则执行指令MOVAL,[BX][DI],执行结果AL=?5)相对基址加变址寻址方式操作数在存储器内,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)的内容之和再加上位移量(8位或16位),得到操作数所在单元的有效地址。(BX)(SI)DISP8
(BP)(DI)DISP16有效地址=++有效地址:EA=11FDH物理地址:221FDH执行结果:将221FDH单元内容送入寄存器AL中。[例]已知:(DS)=3000H,(BX)=2000H,(SI)=1000H,MK=0250H,指令:
MOVAX,MK[BX][SI]
或MOVAX,MK[BX+SI]
或MOVAX,[MK+BX+SI]执行结果:AX=?
有效地址:3250H物理地址:33250H执行结果:将33250H单元内容送AL,33251H内容送AH存储器物理地址:3324FH33250H33251H33252H33253H6BH4CH34H99H56H4、段超越当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀来指定所用的段寄存器。
段超越前缀形式为:段寄存器名:[例]MOVAX,ES:[BP];段地址在ESMOVAX,CS:[BX][SI];段地址在CS段地址的基本约定和允许超越的情况如表所示:存储器存取方式约定段允许超越段偏移地址取指令堆栈操作源串目的串BP作基址通用数据读写CSSSDSESSSDS无无CS,ES,SS无CS,DS,ESCS,ES,SSIPSPSIDI有效地址EA有效地址EA5、对8086内存寻址方式的注解(1)在汇编后,指令中的变量名由具体的偏移地址所取代。
(2)在寄存器相对寻址与相对基址加变址方式中,位移量disp可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。(3)计算出的有效地址以16位表示,若超过0FFFFH,CPU将忽略溢出。(4)记忆8086内存操作数形式的简易方法如下:
[BX][SI][disp][BP][DI]每列选择0项或一项,构成至少一项,即可得到有效的内存操作数形式。
3.2指令系统8086/8088的指令系统可以分为6组:(1)数据传送指令;(2)算术运算指令;(3)逻辑运算与移位指令;(4)串操作指令;(5)控制转移指令;(6)处理器控制指令;
一、数据传送指令数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中
。1.MOV(Move):传送指令指令格式为:MOVdest,src
;dest←src功能:将源操作数src复制到目的操作数dest中,结果目的操作数的内容等于源操作数的内容,源操作数src的内容不变。对标志位的影响:无语法格式:MOVreg/mem/sreg
,reg/mem/sreg/imm说明:(1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。
MOVsreg
,sreg
;错误
MOVmem
,mem
;错误
(2)立即数不能传送到段寄存器中。
MOVsreg
,imm
;错误(3)目的操作数不允许使用CS段寄存器。(4)dest与src必须类型匹配,即同时是字节或字类型。以下几点要注意:寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。
[例]MOVAX,12HMOVAL,12HMOVAX,[2000H]MOVAL,[2000H]*CS不能为目的操作数,不能对IP直接传送数据*堆栈操作不允许为字节操作几个不能传送的解决办法:用AX作桥梁
存储器←存储器:
MOVAX,[BX] MOV[SI],AX段寄存器←段寄存器:
MOVAX,DS
MOVES,AX段寄存器←立即数:
MOVAX,1234H MOVDS,AX[例]错误的MOV指令如下所示:MOVAX,BLMOVDS,1000HMOV[BX],[SI]MOVES,CSMOVCS,AX[例]设B是已定义的字节变量,以下是一些错误和正确的指令。
BDB34HMOVAX,BMOVAL,B类型不匹配不允许立即数送段寄存器不允许内存操作数之间传送不允许段寄存器之间传送CS不能作为目的操作数2.XCHG(Exchange):交换指令指令格式为:XCHGoprd1,oprd2
;交换oprd1与oprd2的内容语法格式为:XCHGreg/mem,reg/mem说明:XCHGmem,mem
错误段寄存器和立即数不能作为该指令的操作数[例]XCHGBX,[BP+SI]如果指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,[2F246H]=4254H,则指令执行后:结果如何?3.堆栈操作指令作用:在调用子程序(过程)或处理中断时,保存断点地址;现场数据保存:暂时存放寄存器或存储器操作数的内容。指令格式:进栈PUSHSRC操作:SPSP-2,
[SP]SRC出栈POPDST操作:DST[SP],SPSP+2AX=1020H低地址(SS段)执行前(AX)=1020H(SP)(SS段)执行后20H10H(AL)(AH)PUSHAX指令执行示意图(SP)-2(SP)高地址低地址高地址(SP)-1POPBX低地址(SS段)执行前20H10HPOPBX指令执行示意图(SP)(SS段)执行后(BX)=1020H(SP)(SP)+1(SP)+2BX2010高地址低地址高地址8086/8088系统的堆栈具有如下特点:·堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元;·堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反;·堆栈操作只能作字操作;
PUSHAL;错误·SS:SP在任何时候都指向当前的栈顶。4.地址传送指令指令格式:有效地址传送指令:
LEAreg16,mem
;
reg16addr(mem)
功能:将源操作数在段内的偏移地址传送给目标寄存器[例]TABLEDB56HLEADI,TABLELEASI,[2000H]LEA指令与MOV指令的区别:LEASI,BUFF;将变量BUFF的偏移地址送入寄存器中MOVSI,BUFF;将变量BUFF所指存储单元的内容送入SIBUFF=0123454800FEFFLEASI,BUFF;执行后:(SI)=0002HMOVSI,BUFF;执行后:(SI)=0048H段起始位置指令格式:*地址指针传送指令:LDSreg16,mem
;
LESreg16,mem
;功能:将由源操作数偏移地址决定的4个连续字节单元(双字单元)内容分别送入指令指定的寄存器以及DS或ES中。其中:低16位送到指定的16位寄存器,高16位送到DS或ES中。[例]TABLEDD12345678HLESBX,TABLE57H13H68H24H[例](DS)=C000H,[C2480H]=1357H,
[C2482H]=2468HDS:2480HDS:2481HDS:2482HDS:2483H
1357
2468SIDSLDSSI,[2480H]5.累加器专用传送指令
有三条:查表指令、输入和输出指令指令格式:查表指令:XLAT;AL以BX+AL为EA指向的存储单元的内容
或XLATOPRD;OPRD为表的首地址名称功能:完成一个字节的查表转换,要求:①AL的内容是查找对象在表中的下标,②表的首地址在BX中,③执行结果:查找对象存放在AL中
。[例]MOVBX,OFFSETTABLEMOVAL,4XLAT;查表
92H35H5DHTABLE输入输出指令用于AL/AX与I/O端口之间的数据传送指令格式:输入指令:INAL,imm8;AL←[imm8]pINAX,imm8;AX←[imm8+1][imm8]pINAL,DX;
AL←[DX]pINAX,DX;
AX←[DX+1][DX]p功能:从I/O端口输入数据至AL或AX。输入指令允许把一个字节或一个字由一个输入端口传送到AL或AX中。若端口地址超过255时,则必须用DX保存端口地址,端口寻址最多可寻找64K个端口。[例]INAL,20HMOVDX,3F0HINAX,DX输出指令:
OUTimm8,AL;
AL→[imm8]p OUTimm8,AX;AX→[imm8+1][imm8]p OUTDX,AL;AL→[DX]p OUTDX,AX;AX→[DX+1][DX]p功能:将AL或AX的内容输出至I/O端口。端口寻址方式与IN指令相同。[例]MOVAL,78HOUT27H,ALMOVDX,678HOUTDX,AL注意:MOVDX,AL???*6.标志寄存器传送指令指令格式:
LAHF;AHFR低字节
SAHF;FR低字节AHPUSHF;SPSP-2,[SP+1][SP]FRPOPF;FR[SP+1],[SP],SPSP+2功能:LAHF/SAHF指令是寄存器AH与标志寄存器FR的低字节之间完成的字节型数据传送。
PUSHF/POPF指令是标志寄存器FR与堆栈间进行的字型数据传送。指令SAHF/POPF将影响标志位。二、算术运算指令1.加法指令指令格式:加法:
ADDDST,SRC;DSTSRC+DST带进位加法:ADCDST,SRC;DSTSRC+DST+CF加1:INCOPR;OPROPR+1说明:1)这三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF。2)两操作数要求同时为带符号数或同时为无符号数,且类型要一致。[例]设AX=65A0H,BX=B79EH,则指令
ADDBX,AX的执行情况:
0110010110100000+)101101111001111010001110100111110则:CF=1,SF=0,OF=0,AF=0,PF=0,ZF=0怎样看待CF和OF???[例]有两个双字变量FIRST和SECOND,要求将存放的双字数据相加结果存放在双字变量THIRDFIRSTDD12345678HSECONDDD87654321HTHIRDDD?MOVAX,WORDPTR[FIRST]ADDAX,WORDPTR[SECOND]MOVWORDPTR[THIRD],AXMOVAX,WORDPTR[FIRST+2]ADCAX,WORDPTR[SECOND+2]MOVWORDPTR[THIRD+2],AXFIRST[2]2.减法指令指令格式:减法:SUBDST,SRC;DSTDST-SRC带进位减法:SBBDST,SRC;DSTDST-SRC-CF减1:DECOPR;OPROPR-1求补:NEGOPR;
OPR0-OPR
比较:CMPOPR1,OPR2;OPR1-OPR2说明:1)以上五条指令除DEC不影响CF外,其他都按一般规则影响状态标志位。2)ADC和SBB用于类型为双字或双字以上的操作数的运算3)INC和DEC常用于循环程序中修改循环次数或者修改地址指针等
DECBYTEPTR[BX]DECWORDPTR[BX]4)求补指令执行的效果是改变操作数的符号,绝对值不变,如:若AL=00010001B=+17,执行NEGAL后,
AL=11101111B=[-17]补
5)CMP指令不改变目的操作数的内容,对状态标志位的影响和SUB指令相同,可用于判断两操作数的大小关系,一般用于条件转移指令之前
[例]设AX=65A0H,BX=B79EH,则指令
SUBAX,BX的执行情况:
0110010110100000+)0100100001100010[-BX]补
1010111000000010则:CF=?,AF=?
SF=1,OF=1,PF=0,ZF=0对于减法,CF的值是看借位,义够不够减,当将减法转变为加法运算时,则CF:有进位相当于无借位,CF=03.乘法指令指令格式:无符号数乘法:MULSRC
字节乘法;AXAL*SRC
字乘法;(DX,AX)AX*SRC带符号数乘法:IMULSRC说明:1)进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中;进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。2)源操作数可以是mem/reg,不允许使用立即数。3)乘法指令运算结果只影响状态标志CF、OF。[例]MULBX;无符号数乘法,BX乘上AX4.除法指令指令格式:无符号数除法:
DIVSRC若SRC为字节数据,ALAX/SRC的商
AHAX/SRC余数若SRC为字数据,
AX(DX,AX)/SRC的商
DX(DX,AX)/SRC余数带符号数除法:IDIVSRC除法指令运算结果对状态标志的影响无定义。若商超过存放它的寄存器的取值范围时,引起0型中断:除法出错中断。8086/8088规定IDIV指令运算结果余数的符号与被除数相同。带符号数除法运算中,当被除数位数不够时,可进行扩展。符号扩展指令:字节扩展到字:CBW;将寄存器AL中的符号位扩展到寄存器AH字扩展到双字CWD;将寄存器AX中的符号位扩展到寄存器DX70AL70AH015AXDX150CBWCWD[例]求8BF4H÷0100H若是带符号数,可用CWD指令将被除数进行符号扩展后再相除:
MOVAX,8BF4H
CWDMOVBX,0100HIDIVBX若是无符号数,可采取高位补0的办法扩展
MOVAX,8BF4H
MOVDX,0MOVBX,0100HDIVBX5.BCD码十进制调整指令指令格式:压缩BCD码加法十进制调整:DAA执行的操作:这条指令执行前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加的结果存放在AL寄存器中。压缩BCD码减法十进制调整:DAS执行的操作:这条指令执行之前,必须先执行SUB或SBB指令,减法指令必须把两个BCD码相减的结果存放在AL寄存器中。压缩BCD码加法调整的方法:累加器AL低4位大于9或辅助进位标志位AF=1,则累加器AL加06H修正。累加器AL高4位大于9或进位标志位CF=1,则累加器AL加60H修正。[例]进行BCD码加法运算59+68=1270101100159+011010006811000001C1+0110011066
100100111127
MOVAL,59HADDAL,68HDAA加法运算结果为C1AF=1,高位大于9加66H进行压缩BCD调整[例]计算(4516)10+(2695)10。两操作数以BCD码的形式存放在AX和BX中,AX=4516H,BX=2695H。要求将最后的运算结果存放在AX中。
ADDAL,BLDAAMOVDL,ALMOVAL,AHADCAL,BHDAAMOVAH,ALMOVAL,DL*非压缩BCD码十进制调整指令格式:加法十进制调整:
AAA减法十进制调整:AAS
AAA/AAS用于由两个非压缩BCD数相加/减后存放在AL中的结果的调整,紧跟在ADD/ADC、SUB/SBB后乘法十进制调整:AAMAAM指令紧跟在MUL后,将AL的内容调整:AHAL/0AH(十位),ALAL%0AH(个位)[例]MULBLAAM若执行前:AL=07H,BL=09H,则执行MULBL后,AX=003FH,再执行AAM指令后,正确的结果为:AH=06H,AL=03H。除法十进制调整:AADAAD指令用在DIV前,先调整AX的内容:ALAH*0AH+AL,AH0相除之后,以非压缩BCD码表示的商在AL中,而相应的余数在AH中。三、逻辑运算与移位指令1.逻辑运算指令:对字节或字数据进行按位的操作。指令格式:逻辑与:ANDDST,SRC;DSTDST
ANDSRC逻辑或:ORDST,SRC;DSTDST
ORSRC逻辑非:NOTOPR;OPR/OPR异或:XORDST,SRC;
DSTDST
XORSRC测试:TESTOPR1,OPR2;OPR1ANDOPR2AND指令主要用来屏蔽掉一个数中某些位,以便对剩下的其它位进行某些处理。[例]ANDAX,BX;两个寄存器逻辑与
ANDAL,0FHANDMEM,0F0HOR指令主要用于将操作数中某几位置位,其他位保留原值[例]ORBX,0F000H;将BX的最高四位置成1,而其它位不变。XOR指令常用于使操作数的某些位不变,其他位取反。[例]XORBX,0F000HXORAL,AL;CF=0NOT指令改变操作数的每一位,原来为0变为1,原为1变为0。[例]NOTAX;AX各位取反TEST指令是一条测试指令,它执行的操作与AND相同,不过它不送回结果给目标操作数,只影响标志位。[例]TESTAL,00000001B如AL最低位为0,则ZF=1。2.移位指令逻辑左移:SHLOPR,CNT算术左移:SALOPR,CNT逻辑右移:SHROPR,CNT算术右移:SAROPR,CNT其中:OPR为操作数,CNT为1或CL:表示移位次数0CFOPR0CFOPRCFOPR[例]设AL=10110100B,CF=1在SALAL,1之后,AL=01101000BCF=1在SARAL,1之后,AL=11011010BCF=0在SHLAL,1之后,AL=01101000BCF=1在SHRAL,1之后,AL=01011010BCF=0MMM算术左移(SAL)和算术右移(SAR)实现带符号数移位。SAR通过在整个移位过程中复制符号来保护操作数的符号。SAL若移一位,但如果符号位发生变化的话,就将1送OF标志。逻辑左移(SHL)和逻辑右移(SHR)对无符号数的移位。[例]将两个非压缩BCD码(高位在BL,低位在AL)合并成压缩BCD码送AL。
MOVCL,4;将计数值送CLSHLBL,CL;将BCD码高位移到BL的高4位
ANDAL,0FH;清零AL高4位
ORAL,BL;合并AL和BL形成压缩BCD码。3.循环移位指令循环左移:ROLOPR,CNT循环右移:ROROPR,CNT带进位循环左移:RCLOPR,CNT带进位循环右移:RCROPR,CNTCFOPRCFOPRCFOPRCFOPR[例]设AL=10110100B,CF=1执行下列语句:执行ROLAL,1后,AL=01101001B,CF=1执行RORAL,1后,AL=01011010B,CF=0执行RCLAL,1后,AL=01101001B,CF=1执行RCRAL,1后,AL=11011010B,CF=0[例]若AL中存有8位有符号数,先需要将其乘以8(23),结果存入AX中,则:
CBWMOVCL,3SALAX,CL[例]若有一个双字数据存放在(DX,AX),要实现将双字数据整个左移一位,则:
SALAX,1RCLDX,1[例]BCD码转换为ASCII码若在内存中存放着用BCD码表示的十进制数。存储单元中存放BCD码(00H~99H),要求把它们分别转换为ASCII码。高位的BCD码转换完后放在地址较高的单元。分析:转换公式:ASCII=(非压缩)BCD+30H算法:取BCD转ASCII后存入(先低位,后高位)
BCDBUFFDB79HASCBUFDB2DUP(?)MOV SI,OFFSETBCDBUFF;设置源地址指针MOV DI,OFFSETASCBUF;设置目的地址指针MOV AL,[SI]MOV BL,ALAND AL,0FH;取低位BCD码OR AL,30H;转换成ASCII码MOV [DI],AL;存入INC DI;修改指针MOV AL,BLMOV CL,4SHR AL,CLOR AL,30H;高位转换成ASCII码MOV [DI],AL;存入四、串操作指令串操作:对存储区中连续存放的字节串或字串进行操作1.重复指令前缀串操作类指令可以与重复指令前缀配合使用,从而可以使操作得以重复进行。重复前缀汇编格式执行过程影响指令REP(1)若(CX)=0,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3)MOVS,STOS,LODSREPE/REPZ(1)若(CX)=0或ZF=0,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3)CMPS,SCASREPNE/REPNZ(1)若(CX)=0或ZF=1,则退出;(2)CX=CX-1;(3)执行后续指令;(4)重复(1)-(3)CMPS,SCAS2.串指令串指令共有五种,具体见下表。对串指令要注意以下几个问题:(1)各指令所使用的默认寄存器是:SI(源串地址),DI(目的地址),CX(串长度),AL(存取或搜索的默认值)。(2)源串在数据段,目的串在附加段。(3)方向标志与地址指针的修改。DF=1,则修改地址指针时用减法;DF=0时,则修改地址指针时用加法。(4)MOVS、STOS、LODS指令不影响标志位。串操作指令功能指令格式执行操作串传送MOVSDST,SRCMOVSBMOVSW由操作数说明是字节或字操作;其余同MOVSB或MOVSW[(ES:DI)]←[(DS:SI)];SI=SI±1,DI=DI±1;
[(ES:DI)]←[(DS:SI)];SI=SI±2,DI=DI±2;串比较CMPSSRC,DSTCMPSBCMPSW由操作数说明是字节或字操作;其余同CMPSB或CMPSW[(DS:SI)]-[(ES:DI)];SI=SI±1,DI=DI±1;[(DS:SI)]-
[(ES:DI)];SI=SI±2,DI=DI±2;串搜索SCASDSTSCASBSCASW由操作数说明是字节或字操作;其余同SCASB或SCASWAL-[(ES:DI)];DI=DI±1;AX-[(ES:DI)];DI=DI±2;存串STOSDSTSTOSBSTOSW由操作数说明是字节或字操作;其余同STOSB或STOSWAL→[(ES:DI)];DI=DI±1;AX→[(ES:DI)];DI=DI±2;取串LODSSRCLODSBLODSW由操作数说明是字节或字操作;其余同LODSB或LODSW[(DS:SI)]→AL;SI=SI±1;[(DS:SI)]→AX;SI=SI±2;[例]在数据段中有一字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中,其中源串存放在数据段中从符号地址MESS1开始的存储区域内,每个字符占一个字节;MESS2为附加段中用以存放字符串区域的首地址。
LEASI,MESS1;置源串偏移地址
LEADI,MESS2;置目的串偏移地址
MOVCX,17;置串长度
CLD;方向标志复位
REPMOVSB;字符串传送
其中,最后一条指令也可写成
REPMOVSMESS2,MESS1[例]现要求找出MESS1和MESS2之间不相匹配的位置。
LEASI,MESS1;装入源串偏移地址
LEADI,MESS2;装入目的串偏移地址
MOVCX,17;装入字符串长度
CLD;方向标志复位
REPECMPSB
上述程序段执行之后,SI或DI指向两字符串中首个不匹配字符的下一个。若两字符串中没有不匹配的字符.则当比较完毕后,CX=0,退出重复操作状态。[例]在附加段中有一个字符串,存放在以符号地址MESS2开始的区域中,长度为17,要求在该字符串中搜索空格符(ASCII码为20H)。
LEADI,MESS2;装入目的串偏移地址
MOVAL,20H;装入关键字节
MOVCX,17;装入字符串长度
CLD REPNESCASB
上述程序段执行之后,DI的内容即为相匹配字符的下一个字符的地址,CX中是剩下还未比较的字符个数。若字符串中没有所要搜索的关键字节,则当查完之后(CX)=0退出重复操作状态。[例]要对附加段中从MESS2开始的5个连续的内存字节单元进行清0操作,可用下列程序段实现:
LEADI,MESS2;装入目的区域偏移地址
MOVAL,00H;为清零操作准备
MOVCX,5;设置区域长度
CLD REPSTOSB五、控制转移指令转移指令分成无条件转移指令和条件转移指令。1.无条件转移指令转移可以分成两类:段内转移和段间转移。段内转移是指在同一段的范围之内进行转移,此时只需改变IP寄存器的内容,即用新的转移目标地址代替原有的IP的值就可达到转移的目的。段间转移则是要转到另一个代码段去执行程序,此时不仅要修改IP寄存器的内容,还需要修改CS寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成。CODESEGMENT......MOVCX,10MOVAX,0L1:ADDAX,CXDECCXCMPCX,0
JZL2
JMPL1L2:.......CODEENDSCODE1SEGMENT......
JMPFARPTRL1.......CODE1ENDSCODE2SEGMENT......L1:MOVAX,2345H.......CODE2ENDS(1)段内直接转移
JMPSHORTOPR;操作:IP←IP+8位位移量
JMPNEARPTROPR;操作:IP←IP+16位位移量
功能:OPR是一个标号,即符号地址,表示转移的目的地址。在指令中转移地址是相对于IP的当前值的位移量表示的
[例]JMPSHORTNEXT......NEXT:MOV......*(2)段内间接转移
JMPOPR;操作:IP←有效地址即:JMPreg16JMPmem16[例]MOVAX,5678HJMPAXMOVBX,2000HJMPWORDPTR[BX](3)段间直接转移
JMPFARPTROPR
操作:IP←OPR的段内偏移地址
CS←OPR所在段的段地址功能:OPR是符号地址,表示转移的目的地址。在指令中转移地址提供偏移地址和段地址。
[例]JMP2000H:0078H*(4)段间间接转移
JMPDWORDPTROPR
即:JMPDWORDPTRmem
操作:IP←[EA],CS←[EA+2][例]MOVBX,2000HMOVDI,1200HJMPDWORDPTR[BX+DI]2.条件转移指令这类指令都是段内直接短转移,在指令中转移地址是相对于IP的当前值的8位位移量表示的。状态标志作为转移的条件,当满足一定的条件时,转移到指定的地址,否则,将顺序执行下条指令。作为判断条件的状态标志位有:CF、PF、ZF、SF和OF。根据单个标志位的设置情况转移这组包括10种指令,它们一般适用于测试某一次运算的结果并根据其不同特征产生程序分支作不同处理的情况。结果为零(或相等)转移:JZ/JEOPR;ZF=1
结果不为零(或不相等)转移:JNZ/JNEOPR;ZF=0
结果为负转移:JSOPR;SF=1
结果为正转移:JNSOPR;SF=0溢出转移:JOOPR;OF=1无溢出转移:JNOOPR;OF=0奇偶位为1转移:JP/PEOPR;PF=1奇偶位为0转移:JNP/JPOOPR;PF=0低于/不高于且等于/进位为1转移:
JCOPR;CF=1不低于/高于或等于/进位为0转移:
JNCOPR;CF=0(2)比较两个无符号数,并根据比较的结果转移。低于/不高于且不等于/进位为1转移:
JB/JNAE/JCOPR;CF=1不低于/高于或等于/进位为0转移:
JAE/JNB/JNCOPR;CF=0或ZF=1低于或等于/不高于转移:
JBE/JNAOPR;CF=1或ZF=1不低于且不等于/高于转移:
JA/JNBEOPR;CF=0且ZF=0(3)比较两个带符号数,并根据比较结果转移。小于/不大于且不等于转移:
JL(或JNGE)OPR;SF⊕ZF=1^ZF=0
不小于/大于或者等于转移:
JGE(或JNL)
OPR;SF⊕ZF=0∨ZF=1小于或等于/不大于转移:
JLE(或JNG)OPR;SF⊕ZF=1∨ZF=1不小于且不等于/大于转移:
JG(或JNLE)OPR;SF⊕ZF=0^ZF=0
(4)测试CX的值为0则转移指令
JCXZOPR;CX=0则转移
3、循环控制指令这类指令都是段内直接短转移,在指令中转移地址是相对于IP
的当前值的8位位移量表示的。以CX为递减计数器,初值为循环次数(1)LOOP
指令格式:LOOPOPR
指令执行:CX←CX-1,若CX≠0则转到目标地址处执行,否则退出循环,顺序执行下一条指令
测试条件:CX≠0(2)LOOPZ/LOOPE(Loopwhilezeroandequal)
指令格式:LOOPZ(或LOOPE)OPR
测试条件:ZF=1且CX≠0(3)LOOPNZ/LOOPNE(Loopwhilenonzeroandnotequal)指令格式:LOOPNZ(或LOOPNE)OPR
测试条件:ZF=0且CX≠0[例]统计BUFF起始地址的100个字节单元中负数的个数,将统计结果送NUM单元。XORBL,BLMOVCX,100LEASI,BUFFCLDNEXT:LODSBTESTAL,80HJZGOODINCBLGOOD:LOOPNEXTMOVNUM,BL
XORBL,BLMOVCX,100LEASI,BUFFNEXT:MOVAL,[SI]TESTAL,80HJZGOODINCBLGOOD:INCSILOOPNEXTMOVNUM,BLXORBL,BLMOVCX,100MOVSI,0NEXT:MOVAL,BUFF[SI]TESTAL,80HJZGOODINCBLGOOD:INCSILOOPNEXTMOVNUM,BLXORDL,DLMOVCX,100LEABX,BUFFMOVSI,0NEXT:MOVAL,[BX+SI]TESTAL,80HJZGOODINCDLGOOD:INCSILOOPNEXTMOVNUM,DL[例]分析程序:
BUFFDB79H,98H,23H,67H,0A8H
MAXDB?MOVCX,5LEASI,BUFFMOVAL,[SI]DECCXINCSILP:CMPAL,[SI]JGEG1MOVAL,[SI]G1:INCSILOOPLPMOVMAX,AL
4、子程序将完成某独立功能的程序模块编成子程序,主程序在需要的时候进行调用,执行完子程序后再返回到主程序继续执行。
CALL调用指令:用在调用程序中,分为段内调用和段间调用
段内调用:子程序名中包含NEAR
段间调用:子程序名中包含FAR(1)段内直接调用指令格式:CALLPROCPROC是子程序名,即子程序入口处的符号地址。在指令中转移地址是相对于IP的当前值的位移量表示的
执行的操作:SP←SP-2;[SP]←IP;IP←IP+disp16;*(2)段内间接调用指令格式:CALLreg16/CALLmem16
执行的操作:SP←SP-2;[SP]←IP;
IP←reg16/IP←WORDPTR[mem]CODESEGMENT......CALLProc1……Proc1PROCnear……RETProc1ENDP......CODEENDSCODE1SEGMENT......CALLFARPTRProc1.......CODE1ENDSCODE2SEGMENT......Proc1PROCfar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安徽中医药大学辅导员公开招聘11名笔试参考试题及答案详解
- 高新招聘笔试题及答案
- 2026年广东省揭阳市中小学编制教师招聘考试模拟试题及答案详解
- 2026年安全生产月知识竞赛试题附答案
- 中建6局笔试题目及答案
- 2026上海金山区部分卫生健康事业单位公开招聘12名人员(第二批)考试备考试题及答案详解
- 2026福建省农业科学院水稻研究所稻作技术研究室公开招聘科研助理1名考试备考试题及答案详解
- 航运专业笔试题及答案
- 2026江西吉安市吉州区园投人力资源服务有限公司劳务外包人员招聘1人试题附答案
- 2026年甘肃兰州安宁区培黎街道社区卫生服务中心招聘中医医师笔试参考试题及答案详解
- 2026年广西中考语文试卷(含答案)
- 2026年四川资中县重龙映象文化旅游开发集团有限责任公司人员招聘28人笔试历年常考点试题专练附带答案详解
- 西藏交通发展集团有限公司招聘笔试真题2025
- 2026年建筑八大员(机械员)岗位考试试题及答案
- 屋面防水施工方案
- 阿里云邮箱购买合同
- 2024年高考政治试卷(贵州)(解析卷)
- 职业教育政策题目及答案
- 2026年输血技师副高考试试题及答案解析
- 2026 第六届“四川工匠杯”职业技能大赛 餐厅服务赛项 理论考试参考题库 含答案
- 医院评残疾工作制度
评论
0/150
提交评论