资源描述
1,4.3.3逻辑运算和移位指令,逻辑运算指令(与/或/异或/非)运算规则:按位操作,无进/借位对标志位的影响(除NOT指令外):,CFOFSFZFPFAF00*无定义,根据运算结果设置,注意:非指令NOT对标志无影响,2,逻辑运算类指令表,3,(1)逻辑”与”AND,对两个操作数进行按位逻辑“与”操作。格式:ANDdest,src用途:保留操作数的某几位,清零其他位。例1:保留AL中低4位,高4位清0。ANDAL,0FH例2:AL中有字符az,将其转换成大写。ANDAL,01011111B,4,例3:测试AL的bit7,bit5,bit2是否都是1。ANDAL,10100100BCMPAL,10100100BJZYES;ifmatch,gotoYES;ifnotmatchYES:;goeshereifall1,5,对两个操作数进行按位逻辑”或”操作。格式:ORdest,src用途:对操作数的某几位置1;对两操作数进行组合。例1:把AL中的非压缩BCD码变成相应十进制数的ASCII码。ORAL,30H,(2)逻辑”或”OR,6,例2:把AH和AL中的非压缩BCD码组合成压缩的BCD码,放到AL中。MOVCL,4SHLAH,CLORAL,AH例3:把AL的第5位置为1ORAL,00100000B,7,对操作数进行按位逻辑”非”操作。格式:NOTmem/reg例:NOTCXNOTBYTEPTRDI,(3)逻辑“非”(取反)NOT,8,对两个操作数按位进行”异或”操作。格式:XORdest,src用途:对reg清零(自身异或)把reg/mem的某几位变反(与1异或)例1:把AX寄存器清零。例2:把DH的bit4,3变反MOVAX,0XORDH,18HXORAX,AXANDAX,0SUBAX,AX,(4)逻辑”异或”XOR,9,操作与AND指令类似,但不将”与”的结果送回,只影响标志位。AND与TEST间的区别类似于SUB与CMP间的区别作用:TEST指令常用于位测试,与条件转移指令一起用。例:测试AL的内容是否为负数。TESTAL,80H;检查AL中D7=1?JNZMINUS;是1(负数),转MINUS;否则(正数)不转移MINUS:,(5)测试指令TEST,10,移位操作类指令表,2.移位指令,11,移位指令功能示意,算术左移指令,算术右移指令,逻辑左移指令,逻辑右移指令,小循环右移指令,小循环左移指令,大循环左移指令,大循环右移指令,CF=,12,2.移位指令,(1)非循环移位指令算术左移指令SAL(ShiftArithmeticLeft)算术右移指令SAR(ShiftArithmeticRight)逻辑左移指令SHL(ShiftLeft)逻辑右移指令SHR(ShiftRight)这4条指令的格式相同,以SAL为例:SALmem/reg,CL;移位位数1时1;移位位数=1时,13,移位指令执行的操作如下图所示:,最低位,最高位,CF,0,(a)算术/逻辑左移SAL/SHL,最低位,最高位,CF,(b)算术右移SAR,最低位,最高位,CF,(c)逻辑右移SHR,0,非循环移位指令功能示意图,14,算术移位把操作数看做有符号数;逻辑移位把操作数看做无符号数。移位位数:一般放在CL寄存器中,但如果只移1位,也可以直接写在指令中。例如:MOVCL,4SHRAL,CL;AL中的内容右移4位对Flags影响:影响CF,PF,SF,ZF,OF标志。移位效果:结果未溢出时:左移1位操作数2右移1位操作数2,15,例:把AL中的数x10因为10=8+2=23+21,所以可用移位实现乘10操作。程序如下:SALAL,1;2xMOVAH,ALSALAL,1;4xSALAL,1;8xADDAL,AH;8x+2x=10 x,16,不含CF的(小)循环左移指令ROL不含CF的(小)循环右移指令ROR含CF的(大)循环左移指令RCL含CF的(大)循环右移指令RCR格式同非循环移位指令。移位位数一般放在CL寄存器中但如果只移1位,也可直接写在指令中。对Flags的影响:只影响标志位CF和OF。,(2)循环移位指令,17,这4条指令的功能如下图示:,最低位,最高位,CF,(a)ROL,最低位,最高位,CF,(c)RCL,最低位,最高位,CF,(b)ROR,最低位,最高位,CF,(d)RCR,循环移位指令功能示意图,18,用移位操作代替乘除法可提高运算速度例:前例中计算x10。(1)采用乘法指令:MOVBL,10MULBL共需7077个T周期。(2)采用移位和加法指令:SALAL,1;2TMOVAH,AL;2TSALAL,1;2TSALAL,1;2TADDAL,AH;3T只需11个T周期,仅相当于乘法的1/7。,19,循环移位举例:,例1:将AL的高4位与低4位互换。MOVCL,4ROLAL,CL例2:MOVAL,82HRORAL,1执行结果为:AL=41H,CF=0,OF=1,20,4.3.4串操作指令,串:顺序放在内存中的一组相同类型的数据。串操作:对串中的元素进行相同的操作。串操作的寻址方式:源操作数指针DS:SI(DS可超越)目的操作数指针ES:DI数据块长度CX功能:可完成两个存储单元之间的传送MOVS、比较CMPS、搜索SANS、读LODS、写STOS5种操作(也仅是串指令可以)。一次操作对象为16位(W)或8位(B)数据,但为下一次操作做了准备。,21,串操作指令执行动作示意图,自动循环-加前缀REPREPE/REPZREPNE/REPNZ,(a)方向标志DF=0,(b)方向标志位DF=1,22,每次串操作后(辅助动作):串操作指令自动修改SI和DI字节1,字2。DF标志决定,DF=0增地址方向;DF=1减地址方向。(注意:退出串操作后,指针指向最后操作的元素的下一个元素)重复前缀有的串操作指令前面可加上重复前缀REP。当使用REP前缀时,该指令重复执行,重复执行次数由CX决定(带有REP前缀的串操作指令每执行一次,CX自动减1)。重复前缀包括:REPCX0时重复执行REPE/REPZCX0ZF=1时重复执行REPNE/REPNZCX0ZF=0时重复执行,23,串操作指令表,24,串指令使用的一般方法:,设置源串地址,设置目标串地址,设置串长度,设置操作方向DF,串指令,MOVSI,源串首地址(或LEASI,源串),MOVDI,目的串首地址(或LEADI,目的串),MOVCX,串长度,CLD(或STD),串指令,注意:DS与ES一般在完整程序的开始处设置,在此串指令的程序段中不必重复设置,25,指令执行的操作为:MOVSB:ES:DIDS:SISISI1,DIDI1MOVSW:ES:DI+1DIDS:SI+1SISISI2,DIDI2指令也可写成:MOVSdest,src(即无B或W标识)但要求:src用DS:SI寻址,dest用ES:DI寻址传送是字节还是字,由操作数的类型决定,串传送指令MOVSB/MOVSW,26,串传送指令使用举例,用串传送指令实现200个字节的数据传送:LEASI,MEM1LEADI,MEM2MOVCX,200CLDREPMOVSBHLT,27,串比较指令CMPSB/CMPSW,指令执行的操作为:CMPSB:ES:DI-DS:SISISI1,DIDI1CMPSW:ES:DI+1DI-DS:SI+1SISISI2,DIDI2比较的结果只反映在标志位上,串本身无变化。本指令可用来检查两个串是否相等。,格式:CMPSOPRD1,OPRD2CMPSBCMPSW,28,串比较指令举例,JZSTOPDECSIMOVAL,SIMOVBX,SISTOP:HLT,测试内存中两块200个字节数据是否相同,并找出第一个不相等字符的地址,将该地址和字符存贮起来。,LEASI,MEM1LEADI,MEM2MOVCX,200CLDREPECMPSB,29,串扫描SCASB/SCASW,执行的操作:对字节:ALES:DIDIDI1对字:AXES:DI1DIDIDI2搜索指令执行的仍是比较(减法)操作,结果只影响标志位。要搜索的关键字放在AL(字节)或AX(字)中。本指令用于在串中查找指定的信息。,格式:SCASOPRDSCASBSCASW,30,SCAS指令加上重复前缀后,可对串进行连续扫描比较:若前缀为REPZ,则表示比较结果相等且(ZF=1)且串未结束(CX0),则继续比较。若前缀为REPNZ,则表示比较结果不相等(ZF=0)且串未结束(CX0)就继续比较。,31,例:在ES段的偏移1000H开始处存有10个ASCII码。搜索E,若找到则记下搜索次数及存放地址,并在屏幕上显示Y;若未找到则显示N。(见右图)在屏幕上显示一个字符的指令段如下:(参见附录C.3DOS功能调用)MOVDL,MOVAH,2INT21H实现题目要求的程序段见下页:,1000H,41,42,43,44,45,46,A,B,C,D,F,.,ES段,E,32,MOVDI,1000H;(DI)串偏移地址MOVCX,0AH;(CX)串长度MOVAL,E;搜索关键字=ECLD;从低地址到高地址进行搜索REPNZSCASB;若未找到,继续搜索JZFOUND;找到,转至FOUNDMOVDL,N;串中无E,(DL)NJMPDONE;转至DONEFOUND:DECDI;指针回退MOVADDR,DI;ADDRE的地址SUBDI,1000HMOVNUM,DI;NUM搜索次数MOVDL,Y;(DL)YDONE:MOVAH,2INT21H;显示字符HLT,33,执行的操作为:对字节:ALDS:SISISI1对字:AXDS:SI+1SISISI2串装入指令通常不加重复前缀。LODSB等价于:LODSW等价于:MOVAL,SIMOVAX,SIINCSIINCSIINCSI,串装入指令LODSB/LODSW,格式:LODSOPRDLODSBLODSW,34,36H,32H,39H,31H,STRING1,STRING2,38H,35H,36H,33H,被加数,加数,数据段,8,5,6,2,9,1,6,3,SUM,结果,.,.,07H,07H,02H,06H,265836196277,LEASI,STRING1LEADI,STRING2LEABX,SUMMOVCX,4CLCAGAIN:MOVAL,SIADCAL,DIAAAMOVBX,ALINCSIINCDIINCBXDECCXJNZAGAIN,35,下面要求将两个4字节的ASCII码数据求和,并将和的结果送显示。为此,要先化成ASCII码再送显示,程序段如下:LEASI,SUM+3;(SI)SUM+3MOVCX,4;(CX)和长度STD;置DF=1,减量修改SIMOVAH,02;(AH)功能号LP:LODSB;取BCD码至AL,且SISI-1ADDAL,30H;转换为ASCII码MOVDL,AL;(DL)字符INT21H;显示字符DECCXJNZLP,36,指令的操作为:对字节:ES:DIALDIDI1对字:ES:DI+1DIAXDIDI2本指令用于把一块存储区域填充成某一初始值(即对存储区进行初始化)。存储区域的首地址要预先设置到ES:DI中。要存储到串中的数据要预先存到AL(AX)中。,串存储指令STOSB/STOSW,格式:STOSOPRDSTOSBSTOSW,37,例:把从A000H开始的2KB内存单元清零。程序段如下:MOVDI,0A000HMOVAX,0MOVCX,1024CLDREPSTOSW,
展开阅读全文