微机原理与接口第4章4逻辑运算及串操作指令.ppt

上传人:小飞机 文档编号:6572797 上传时间:2023-11-13 格式:PPT 页数:54 大小:554.50KB
返回 下载 相关 举报
微机原理与接口第4章4逻辑运算及串操作指令.ppt_第1页
第1页 / 共54页
微机原理与接口第4章4逻辑运算及串操作指令.ppt_第2页
第2页 / 共54页
微机原理与接口第4章4逻辑运算及串操作指令.ppt_第3页
第3页 / 共54页
微机原理与接口第4章4逻辑运算及串操作指令.ppt_第4页
第4页 / 共54页
微机原理与接口第4章4逻辑运算及串操作指令.ppt_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《微机原理与接口第4章4逻辑运算及串操作指令.ppt》由会员分享,可在线阅读,更多相关《微机原理与接口第4章4逻辑运算及串操作指令.ppt(54页珍藏版)》请在三一办公上搜索。

1、1,三、逻辑类指令(位操作指令)这一类指令包括逻辑运算指令、移位指令和循环移位指令等三组。,位操作类指令以二进制位为基本单位进行数据的操作当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令注意这些指令对标志位的影响 逻辑运算指令AND OR XOR NOT TEST移位指令SHL SHR SAR 循环移位指令ROL ROR RCL RCR,2,1.逻辑运算指令逻辑运算类指令与算术运算指令不同算术指令是按字节或字进行算术运算,而逻辑运算指令是把操作数按位来进行逻辑运算。“与”运算指令格式:AND dst,src“或”运算指令格式:OR dst,src“非”运算指令格式:NOT

2、opr“异或”运算指令格式:XOR dst,src测试指令格式:TEST dst,src说明:TEST相当于AND运算,但是不保存结果,仅影响标志。,3,1 逻辑运算指令,逻辑运算指令NOT 目的;取反指令AND 目的,源;按位与指令OR 目的,源;按位或指令XOR 目的,源;按位异或指令TEST 目的,源;测试指令,与AND指令操作相同,只是不改变目的操作数的内容单操作数逻辑指令NOT不影响标志位,操作数与INC、DEC和NEG一样:,4,逻辑与指令AND,对两个操作数执行逻辑与运算,结果送目的操作数,AND dest,src;destdestsrc,只有相“与”的两位都是1,结果才是1;否

3、则,“与”的结果为0,5,逻辑或指令OR,对两个操作数执行逻辑或运算,结果送目的操作数,OR dest,src;destdestsrc,只要相“或”的两位有一位是1,结果就是1;否则,结果为0,6,逻辑异或指令XOR,对两个操作数执行逻辑异或运算,结果送目的操作数,XOR dest,src;destdestsrc,只有相“异或”的两位不相同,结果才是1;否则,结果为0,7,测试指令TEST,对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志,TEST dest,src;destsrc,AND与TEST指令的关系,同SUB与CMP指令的关系一样,8,逻辑非指令NOT,对一个

4、操作数执行逻辑非运算,NOT reg/mem;reg/memreg/mem,按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”,9,例 逻辑运算,mov al,75h;AL75Hand al,32h;AL30H;CFOF0,SF0,ZF0,PF1or al,71h;AL71H;CFOF0,SF0,ZF0,PF1xor al,0f1h;AL80H;CFOF0,SF1,ZF0,PF0not al;AL7FH 标志不变,10,逻辑运算指令的应用,and bl,11110110b;BL中D0和D3清0,其余位不变or bl,00001001b;BL中D0和D3置1,其余位不变xor bl

5、,00001001b;BL中D0和D3求反,其余位不变,AND指令可用于复位某些位(同0相与),不影响其他位,OR指令可用于置位某些位(同1相或),不影响其他位,XOR指令可用于求反某些位(同1相异或),不影响其他位,11,例4.7 从偏移地址TABLE开始的内存区中,存放着100个字节型数据,要求将这些数进行累加,并将累加和的低位存SUM单元,高位存SUM+1单元。程序如下:LEA BX,TABLE;(BX)数据表地址指针 MOV CL,100;(CL)数据块长度 XOR AX,AX;清AL、AH,并清进位CFLOOPER:ADD AL,BX;加一个数到AL JNC GOON;如(CF)=0

6、,转移到GOON INC AH;否则,AH加1 GOON:INC BX;地址指针加1 DEC CL;计数值减1 JNZ LOOPER;如(CL)0,转移到LOOPER MOV SUM,AX;否则,(SUM)(AL),(SUM+1)(AH)HLT;停止,12,常见的用法 清进位标志位:AND AX,AX 或 OR AL,AL等 清零操作数:XOR AX,AX 不仅把AX清零,而且也影响了状态标志 把某几位取反:用XOR指令,把要取反的位和1异或,不变的位和0异或 清零或置位某几位:用AND指令清零,用OR指令置位,13,2 移位指令,将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或

7、右移操作移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数:该操作数为1,表示移动一位该操作数为CL,CL寄存器值表示移位位数(移位位数大于1只能CL表示)按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF,14,逻辑左移指令SHL(shift logical left),SHL reg/mem,1/CL;reg/mem左移1或CL位;最低位补0,最高位进入CF,SHL和SAL指令的功能演示,SHL和SAL指令的功能,16,例4.8 将一个16位无符号数乘以10。该数原来存放在以FACTOR为首地址的两个连续的存储单元中(低位在前,高

8、位在后)。因为FACTOR10=(FACTOR8)+(FACTOR2),故可用左移指令实现以上乘法运算。编程如下:MOV AX,FACTOR;(AX)被乘数SHL AX,1;(AX)=FACTOR2MOV BX,AX;暂存BXSHL AX,1;(AX)=FACTOR4SHL AX,1;(AX)=FACTOR8ADD AX,BX;(AX)=FACTOR10 HLT 以上程序的执行时间大约需26个时钟。如用乘法指令编程,执行时间将超过130个时钟。,17,逻辑右移指令SHR(shift logical right),SHR reg/mem,1/CL;reg/mem右移1/CL位;最高位补0,最低位

9、进入CF,18,例4.9 将一个16位无符号数除以512。该数原来存放在以DIVIDAND为首地址的两个连续的存储单元中。因为DIVIDAND512=(DIVIDAND2)256,故可用逻辑右移指令完成上述除法运算。编程如下:MOV AX,DIVIDAND;(AX)被除数SHR AX,1;(AX)=DIVIDAND2XCHG AL,AH;(AL)(AH),相当于循环右移8位CBW;清AX的高8位,(AX)=DIVIDAND512HLT 当然,也可以将立即数9传送到CL寄存器,然后用指令SHR AX,CL完成除以512的运算。但是相比之下,上面的程序执行速度更快。,19,算术左移指令SAL(sh

10、ift arithmetic left),SAL reg/mem,1/CL;与SHL是同一条指令,SHL和SAL指令的功能,21,算术右移指令SAR(shift arithmetic right),SAR reg/mem,1/CL;reg/mem右移1/CL位;最高位不变,最低位进入CF,SAR指令的功能,23,3)循环移位指令 8086/8088指令系统有四条循环移位指令,不带进位标志CF的左循环移位指令ROL和右循环移位指令ROR(也称小循环),以及带进位标志CF的左循环移位指令RCL和右循环移位指令RCR(也称大循环)。循环移位指令的操作数类型与移位指令相同,可以是8位或16位的寄存器或

11、存储器。指令中指定的左移或右移的位数也可以是1或由CL寄存器指定,但不能是1以外的常数或CL以外的其他寄存器。所有循环移位指令都只影响进位标志CF和溢出标志OF,但OF标志的含义对于左循环移位指令和右循环移位指令有所不同。,24,循环移位指令(rotate),循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为:ROL reg/mem,1/CL;不带进位循环左移ROR reg/mem,1/CL;不带进位循环右移RCL reg/mem,1/CL;带进位循环左移RCR reg/mem,1/CL;带进位循环右移循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但

12、不影响SF、ZF、PF、AF标志,演示,演示,演示,演示,ROL指令的功能,ROR指令的功能,RCL指令的功能,RCR指令的功能,29,(1)循环左移指令ROL(ROtate Left)。指令格式:ROL dst,1/CL ROL指令将目的操作数向左循环移动1位或移CL寄存器指定的位数。最高位移到进位标志CF,同时最高位移到最低位形成循环,进位标志CF不在循环回路之内。ROL指令的操作如图4.24所示。,图4.24 ROL指令操作示意图,30,ROL指令将影响CF和OF两个状态标志位。如果循环移位次数等于,且移位以后目的操作数新的最高位与CF不相等,则(OF)=1,否则(OF)=0。因此,OF

13、的值表示循环移位前后符号位是否有所变化。如果移位次数不等于,则OF的值不确定。ROL指令的例子如下:ROL BH,1;寄存器循环左移1位ROL DX,CL;寄存器循环左移(CL)位ROL WORD PTR DI,1;存储器循环左移1位ROL BYTE PTR ALPHA,CL;存储器循环左移(CL)位,31,(2)循环右移指令ROR(ROtate Right)。指令格式:ROR dst,1/CL ROR指令将目的操作数向右循环移动1位或移CL寄存器指定的位数。最低位移到进位标志CF,同时最低位移到最高位。该指令的操作如图4.25表示。ROR指令也将影响状态标志位CF和OF。若循环移位次数等于且

14、移位后新的最高位和次高位不等,则(OF)=1,否则(OF)=0。若循环移位次数不等于,则OF的值不确定。,图4.25 ROR指令操作示意图,32,下面是ROR指令的几个例子:ROR CX,1;寄存器循环右移1位 ROR BH,CL;寄存器循环右移(CL)位ROR BYTE PTR BETA,1;存储器循环右移1位 ROR WORD PTR ALPHA,CL;存储器循环右移(CL)位,33,(3)带进位循环左移指令RCL(Rotate Left through Carry)。指令格式:RCL dst,1/CL RCL指令将目的操作数连同进位标志CF一起向左循环移动1位或移CL寄存器指定的位数。最

15、高位移入CF,而CF移入最低位。该指令的操作如图4.26所示。RCL指令对状态标志位的影响与ROL指令相同。,图4.26 RCL指令操作示意图,34,(4)带进位循环右移指令RCR(Rotate Right through Carry)。指令格式:RCR dst,1/CL RCR指令将目的操作数与进位标志CF一起向右循环移动1位或移CL寄存器指定的位数。最低位移入进位标志CF,CF则移入最高位。该指令的操作如图4.27所示。RCR指令对状态标志位的影响与ROR指令相同。,图4.27 RCR指令操作示意图,35,这里介绍的四条循环移位指令与前面讨论过的移位指令有所不同,循环移位之后,操作数中原来

16、各位的信息不会丢失,而只是移到了操作数中的其他位或进位标志上,必要时还可以恢复。利用循环移位指令可以对寄存器或存储器中的任一位进行位测试。例如,要求测试AL寄存器中第5位的状态是“0”还是“1”,可利用以下指令实现:,MOV CL,5;(CL)移位次数ROL AL,CL;(CF)AL的第5位JNC ZERO;若(CF)=0,转ZERO;否则ZERO:,36,说明 逻辑移位适用于无符号数,算术移位适用于有符号数。逻辑左移和算术左移的机器码完全相同,是助记符的两种写法。ROL循环左移:操作数整体左移,最高位移到CF,最低位补原最高位ROR循环右移:操作数整体右移,最低位移到CF,最高位补原最低位R

17、CL带进位的循环左移:类似于ROL循环移位,CF加入到循环圈中。RCR带进位的循环右移:类似于ROR循环移位,CF加入到循环圈中。,37,四、串操作指令,串操作指令的特征是对数据块(字符串)进行操作,并且其中部分指令可以两个操作数同时是存储器操作数。MOVS(Move string)串传送CMPS(Compare string)串比较SCAS(Scan string)串扫描LODS(Load from string)从串中取数据STOS(Store in to string)存数据到串中,38,说明 串操作指令每次执行完成一个字节或一个字的操作。通常使用重复前缀,用来完成数据块的操作。重复前缀

18、 REP 重复 REPE/REPZ 相等/为零则重复 REPNE/REPNZ 不相等/不为零则重复,39,特点 串操作指令需要指明每次操作的类型:B 字节,W字例如:MOVSB,CMPSW等。串操作指令使用隐含寻址方式,源串地址为DS:SI,目的串地址为ES:DI,待处理串的长度放在CX中。使用DF来表示每次操作以后变址寄存器SI和DI的变化方向CLD;DF=0 SI,DI做增量变化 B:+1或W:+2STD;DF=1 SI,DI做减量变化 B:-1或W:-2,40,MOVS指令(两个操作数同时是存储器操作数)MOVSB 或 MOVSW 以字节或字为单位在存储单元之间传送数据,可以使用REP前

19、缀REP MOVS ES:dst_string,seg:src_stringREP MOVSBREP MOVSW(ES):(DI)(DS):(SI)(SI)(SI)1,(DI)(DI)1(字节操作)(SI)(SI)2,(DI)(DI)2(字操作)其中,DF=0时用“”,DF=1时用“”第一种格式的一个重要优点是可以对源字符串进行段重设(但目的字符串的段地址只能在ES,不可进行段重设)。在第二种和第三种格式中,串操作指令字符的后面加上一个字母“B”或“W”,指出操作对象是字节串或字串。,41,注意:在MOVSB、MOVSW这两种指令下,指令后面不允许出现操作数。例如,以下指令都是合法的:REP

20、MOVS DATA2,DATA1;操作数类型应预先定义 MOVS BUFFER2,ES:BUFFER1;源操作数进行段重设REP MOVS WORD PTRDI,SI;用变址寄存器表示操作数REP MOVSB;字节串传送 MOVSW;字串传送但以下表示方法是非法的:MOVSB DEST,ES:SRC,42,例4.10 将数据段中首地址为BUFFER1的200个字节传送到附加数据段首地址为BUFFER2的内存区中。使用字节串传送指令的程序段如下:LEA SI,BUFFER1;(SI)源串首地址指针LEA DI,BUFFER2;(DI)目的串首地址指针MOV CX,200;(CX)字节串长度CLD

21、;清方向标志DFREP MOVSB;传送200个字节HLT;停止,43,LODS指令,LODSB 或 LODSW 从内存中取出字节或字到累加器AL或AX可以使用REP前缀,但意义不大。LODS seg:src_string;可以段超越LODSB;(AL)(DS):(SI)LODSW;(AX)(DS):(SI)(AL)(DS):(SI)或(AX)(DS):(SI)(SI)(SI)1(字节操作)(SI)(SI)2(字操作)其中,当DF=0时用“”,当DF=1时用“”。,44,例4.11 内存中以BUFFER为首址的缓冲区内有10个非压缩型BCD码形式存放的十进制数,它们的值可能是09中的任意一个,

22、将这些十进制数顺序显示在屏幕上。根据题意可编程如下:LEA SI,BUFFER;(SI)缓冲区首址 MOV CX,10;(CX)字符串长度 CLD;清状态标志位DFGET:LODSB;取一个BCD码到AL ORAL,30H;BCD码转换为ASCII码 MOV AH,02H;(AH)功能号 MOV DL,AL;(DL)字符 INT 21H;显示 DEC CX;(CX)(CX)1 JNZ GET;未完成10个字符则重复 HLT,45,STOS指令STOSB 或 STOSW 从累加器中存字节或字到存储器,可以使用REP前缀 REP STOSES:dst_string REP STOSB;(ES):(

23、DI)(AL)REP STOSW;(ES):(DI)(AX)(ES):(DI)(AL)或(ES):(DI)(AX)(DI)(DI)1(字节操作)(DI)(DI)2(字操作)其中,当DF=0时用“”,当DF=1时用“”。STOS指令对状态标志位没有影响。指令若加上重复前缀REP,则操作将一直重复进行下去,直到(CX)=0。,46,例4.12 将字符装入以AREA为首址的100个字节中。LEA DI,AREAMOV AX,#MOV CX,50CLDREP STOSWHLT 程序采用了送存50个字(#),也可以采用送存100个字节(#)的方法。这两种方法程序执行的结果是相同的,但前者执行速度要更快一

24、些。,47,例4.13 一个数据块由大写或小写的英文字母、数字和各种其他符号组成,其结束符是回车符CR(ASCII码为0DH),数据块的首地址为BLOCK1。将数据块传送到以BLOCK2为首地址的内存区,并将其中所用的英文小写字母(az)转换成相应的大写字母(AZ),其余不变。实现:判断,数据搬家,转换小写字母为大写。前面已经讨论过英文小写字母与相应的大写字母的ASCII码之间有一定的关系,即只需将小写字母的ASCII码减20H,即可得到相应大写字母的ASCII码。程序如下:,48,LEA SI,BLOCK1;(SI)源地址指针 LEA DI,BLOCK2;(DI)目标地址指针 CLD;清方向

25、标志DFNEXT:LODSB;取一个字符到AL CMP AL,0DH;是否回车符 JZ DONE;是,则转DONE CMP AL,61H;否则,是否小于a JC OK;C=1,是小于a,则转OK CMP AL,7BH;是否大于z JNC OK;C=0,是大于z,则转OK SUB AL,20H;否则,AL减20HOK:STOSB;送存 JMP NEXT;转移到NEXTDONE:HLT;停止程序使用回车符控制结束。并没有使用CX,49,CMPS指令,CMPSB 或 CMPSW 以字节或字为单位进行两个存储器操作数的比较,可以使用REPE/REPZ前缀,用源操作数-目的操作数,但并不送目的操作数,与

26、CMP指令可以比较。REPE/REPNE CMPS srg:src_string,ES:dst_stringREPE/REPNE CMPSBREPE/REPNE CMPSW(DS):(SI)(ES):(DI)(SI)(SI)1,(DI)(DI)1(字节操作)(SI)(SI)2,(DI)(DI)2(字操作)CMPS指令与其他指令有所不同,指令中的源操作数在前,而目的操作数在后,50,例4.14 比较两个字符串,找出其中第一个不相等字符的地址。如果两个字符全部相同,则转到ALLMATCH进行处理。这两个字符串长度均为20,首地址分别为STRING1和STRING2。,LEA SI,STRING1;

27、(SI)字符串1首地址 LEA DI,STRING2;(DI)字符串2首地址 MOV CX,20;(CX)字符串长度 CLD;清方向标志DF REPE CMPSB;如相等,重复进行比较 JCXZ ALLMATCH;若(CX)=0,跳至ALLMATCH DEC SI;否则(SI)1,修正地址 DEC DI;(DI)1,使其指向所要寻找的不等字符 HLT;停止ALLMATCH:MOV SI,0 MOV DI,0 HLT;停止,51,SCAS指令SCASB 或 SCASW 在数据串中查找AL或AX中的内容,可以使用REPNE/REPNZ前缀。REPE/REPNE SCASES:dst_string

28、REPE/REPNE SCASB REPE/REPNE SCASW(AL)(ES):(DI)或(AX)(ES):(DI)(DI)(DI)1(字节操作)(DI)(DI)2(字操作)字符串的起始地址只能放在(ES:DI)中,不允许段超越。,52,例4.15 在包含100个字符的字符串中寻找第一个回车符CR(其ASCII码为0DH),找到后将其地址保留在(ES:DI)中,并在屏幕上显示字符 Y。如果字符串中没有回车符,则在屏幕上显示字符 N。该字符串的首地址为STRING。,LEADI,STRING;(DI)字符串首址MOVAL,0DH;(AL)回车符MOVCX,100;(CX)字符串长度CLD;清状态标志位DF REPNE SCASB;如未找到,重复扫描 JZ MATCH;如找到,则转MATCHMOV DL,N;字符串中无回车,则(DL)NJMP DSPY;转到DSPYMATCH:DECDI;(DI)(DI)1 MOV DL,Y;(DL)YDSPY:MOV AH,02H INT 21H;显示字符 HLT,53,表4.6 串操作指令的重复前缀、操作数和地址指针,54,作业,P150 10,12,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号