《指令系统4逻辑运算和移位指令、串操作指令.ppt》由会员分享,可在线阅读,更多相关《指令系统4逻辑运算和移位指令、串操作指令.ppt(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、3.3.3 3.3.3 逻辑运算和移位指令逻辑运算和移位指令1.1.逻辑运算指令逻辑运算指令(与与/或或/异或异或/非非)2.2.运算规则:按位操作,无进运算规则:按位操作,无进/借位借位 3.3.对标志位的影响对标志位的影响(除除NOTNOT指令外指令外):CF OF SF ZF PF AF 0 0 *无定义无定义 根据运算结果设置根据运算结果设置 注意注意:非指令非指令NOT对标志无影响对标志无影响1 1表表 4 3 逻辑运算类指令逻辑运算类指令2 2(1)逻辑逻辑”与与”AND对两个操作数进行按位逻辑对两个操作数进行按位逻辑“与与”操作。操作。格式:格式:AND dest,src用途:用
2、途:保留操作数的某几位,清零其他位保留操作数的某几位,清零其他位。例例1:保留保留AL中低中低4位,高位,高4位清位清0。AND AL,0FH例例2:AL中有字符中有字符az,将其转换成大将其转换成大写。写。AND AL,01011111B3 3例例3:测试测试AL的的bit7,bit5,bit2是否都是是否都是1。AND AL,10100100BCMP AL,10100100B JZ YES ;if match,go to YES ;if not match YES:;goes here if all 1 4 4对两个操作数进行按位逻辑对两个操作数进行按位逻辑”或或”操作。操作。格式:格式:
3、OR dest,src用途:用途:对操作数的某几位置对操作数的某几位置1;对两操作数进行组合对两操作数进行组合。例例1 1:把AL中的非压缩BCD码变成相应十进制 数的ASCII码。OR AL,30H(2)逻辑逻辑”或或”OR5 5例例2:把AH和AL中的非压缩BCD码组合成压 缩的BCD码,放到AL中。MOV CL,4 SHL AH,CL OR AL,AH例例3:把把AL的第5位置为1 OR AL,00100000B6 6对操作数进行按位逻辑对操作数进行按位逻辑”非非”操作。操作。格式格式:NOT mem/reg例:NOT CX NOT BYTE PTRDI(3)逻辑逻辑“非非”(取反取反)
4、NOT7 7对两个操作数按位进行对两个操作数按位进行”异或异或”操作。操作。格式:格式:XOR dest,srcXOR dest,src用途:用途:对对对对regregregreg清零清零清零清零(自身异或自身异或自身异或自身异或)把把把把reg/memreg/memreg/memreg/mem的某几位变反的某几位变反的某几位变反的某几位变反(与与与与1111异或异或异或异或)例例1 1:把把AXAX寄存器清零。寄存器清零。例例2 2:把把DHDH的的bit4,3bit4,3变反变反 MOV AX,0 XOR DH,18H MOV AX,0 XOR DH,18H XOR AX,AX XOR A
5、X,AX AND AX,0 AND AX,0 SUB AX,AX SUB AX,AX (4)逻辑逻辑”异或异或”XOR 8 8 操作操作与与ANDAND指令类似指令类似,但不将但不将”与与”的结果送回的结果送回,只影只影响标志位。响标志位。ANDAND与与TESTTEST间的区别类似于间的区别类似于SUBSUB与与CMPCMP间的区别间的区别作用作用:TEST TEST指令常用于位测试指令常用于位测试,与条件转移指令一起用。与条件转移指令一起用。例:例:测试测试ALAL的内容是否为负数。的内容是否为负数。TEST AL,80H TEST AL,80H ;检查检查ALAL中中D D7 7=1=1
6、?JNZ MINUS JNZ MINUS ;是是1 1(负数负数),转,转MINUSMINUS ;否则否则(正数正数)不转移不转移MINUS:MINUS:(5)测试指令测试指令TEST9 9表表4-4 移位操作类指令移位操作类指令2 2.移位指令移位指令1010移位指令移位指令移位指令移位指令功能示意功能示意算术左移指令算术左移指令算术左移指令算术左移指令算术右移指令算术右移指令算术右移指令算术右移指令逻辑左移指令逻辑左移指令逻辑左移指令逻辑左移指令逻辑右移指令逻辑右移指令逻辑右移指令逻辑右移指令小循环右移指令小循环右移指令小循环右移指令小循环右移指令小循环左移指令小循环左移指令小循环左移指令
7、小循环左移指令大循环左移指令大循环左移指令大循环左移指令大循环左移指令大循环右移指令大循环右移指令大循环右移指令大循环右移指令CF=CF=11112 2.移位指令移位指令(1 1)非循环移位指令非循环移位指令 算术左移指令 SALSAL(Shift Arithmetic LeftShift Arithmetic LeftShift Arithmetic LeftShift Arithmetic Left)算术右移指令 SARSAR(Shift Arithmetic RightShift Arithmetic RightShift Arithmetic RightShift Arithmetic
8、 Right)逻辑左移指令 SHLSHL(Shift LeftShift LeftShift LeftShift Left)逻辑右移指令 SHRSHR(Shift RightShift RightShift RightShift Right)这4条指令的格式相同,以SAL为例:SAL mem/reg,CL ;移位位数1时1 ;移位位数=1时1212移位指令移位指令执行的操作如下图所示:执行的操作如下图所示:最低位最高位CF0(a)算术/逻辑左移 SAL/SHL最低位最高位CF(b)算术右移 SAR最低位最高位CF(c)逻辑右移 SHR0非循环非循环移位指令移位指令功能示意图功能示意图1313算
9、术移位把操作数看做有符号数;逻辑移位把操作数看做无符号数。移位位数:一般放在CL寄存器中,但如果只移1位,也可以直接写在指令中。例如:MOV CL,4 SHR AL,CL ;AL中的内容右移4位对Flags影响:影响CF,PF,SF,ZF,OF标志。移位效果:结果未溢出时:左移1位操作数 2 右移1位操作数 21414例:把AL中的数 x 10因为10=8+2=23+21,所以可用移位实现乘10操作。程序如下:SAL AL,1 ;2xMOV AH,AL SAL AL,1 ;4x SAL AL,1 ;8x ADD AL,AH ;8x+2x=10 x1515 不含CF的(小)循环左移指令 ROLR
10、OL 不含CF的(小)循环右移指令 RORROR 含CF的(大)循环左移指令 RCLRCL 含CF的(大)循环右移指令 RCRRCR格式同非循环移位指令。移位位数一般放在CL寄存器中 但如果只移1位,也可直接写在指令中。对Flags的影响:只影响标志位CF和OF。(2)(2)循环移位指令循环移位指令1616这这4 4条指令的功能如下图示:条指令的功能如下图示:最低位最高位CF(a)ROL最低位最高位CF(c)RCL最低位最高位CF(b)ROR最低位最高位CF(d)RCR循环移位指令功能示意图循环移位指令功能示意图1717用移位操作代替乘除法可提高运算速度例:前例中计算 x10。(1)采用乘法指
11、令:MOVMOV BL,10BL,10 MUL MUL BLBL 共需7077个T周期。(2)采用移位和加法指令:SALSAL AL,1 AL,1 ;2T 2T MOV MOV AH,AL AH,AL ;2T 2T SAL SAL AL,1 AL,1 ;2T 2T SAL SAL AL,1 AL,1 ;2T 2T ADD ADD AL,AH AL,AH ;3T 3T 只需11个T周期,仅相当于乘法的1/7。1818循环移位举例:例1:将AL的高4位与低4位互换。MOV CL,4 ROL AL,CL例2:将1A00H内存单元中的双字(32位)循环左移1位。CMP 1A00H,8000H CMC
12、RCL WORD PTR1A02H,1 RCL WORD PTR1A00H,11919例:设在1000H开始存有四个压缩的压缩的BCDBCD码码12、34、56、78。要求把它们转换为ASCIIASCII码码存放在3000H开始的单元中。假定DS、ES都已设置为数据段的段基址。程序见下页。1000H3000H1234567832H31H34H33H 36H35H38H 37H SI=SI=DI=DI=BX=4BX=42020 MOV SI,1000HMOV SI,1000H;SIBCDSIBCD首址首址 MOV DI,3000HMOV DI,3000H;DIASCIIDIASCII首址首址 M
13、OV BX,4MOV BX,4;置计数器初值置计数器初值BBB:BBB:MOV AL,SI MOV AL,SI MOV AL,SI MOV AL,SI ;ALBCDALBCD码码,第一次取第一次取1212H H AND AL,0FHAND AL,0FHAND AL,0FHAND AL,0FH;屏蔽高屏蔽高4 4位位02H02H OR AL,30HOR AL,30HOR AL,30HOR AL,30H;转换为转换为ASCIIASCII码码3232H H STOSBSTOSBSTOSBSTOSB ;保存结果保存结果,等价等价MOVDIMOVDI,AL INC DIAL INC DI LODSB L
14、ODSB LODSB LODSB ;MOV ALMOV AL,SI INC SISI INC SI MOV CL,4MOV CL,4MOV CL,4MOV CL,4 SHR AL,CLSHR AL,CLSHR AL,CLSHR AL,CL ;逻辑右移逻辑右移4 4位位 OR AL,30HOR AL,30HOR AL,30HOR AL,30H ;得到高得到高4 4位位ASCIIASCII码码 STOSB STOSB STOSB STOSB ;保存结果;保存结果,等价等价MOVDIMOVDI,AL INC DIAL INC DI DEC BX DEC BX ;(BX)(BX)-1(BX)(BX)-
15、1 JNZ BBB JNZ BBB ;(BX)0(BX)0,则继续循环,则继续循环2121作业P152-P153 3.1、3.2、3.7、3.9、3.13、3.16 22223.3.4 3.3.4 串操作指令串操作指令串:顺序放在内存中的一组相同类型的数据。串操作:对串中的元素进行相同的操作。串操作的寻址方式:源操作数指针 DS:SI(DS可超越)目的操作数指针 ES:DI 数据块长度 CX功能:可完成两个存储单元之间的传送MOVS、比较CMPS、搜索SANS、读LODS、写STOS 5种操作(也仅是串指令可以)。一次操作对象为16位(W)或8位(B)数据,但为下一次操作做了准备。2323串操
16、作指令串操作指令串操作指令串操作指令执行动作示意图执行动作示意图执行动作示意图执行动作示意图自动循环自动循环-加前缀加前缀REP REPE/REPZ REPNE/REPNZ(a)方向标志方向标志DF=0(b)方向标志位方向标志位DF=12424 每次串操作后(每次串操作后(辅助动作辅助动作):串操作指令自动修改串操作指令自动修改SISI和和DIDI字节字节11,字,字22。DFDF标志决定标志决定,DF=0 DF=0 增地址方向;增地址方向;DF=1 DF=1 减地址方向。减地址方向。(注意注意:退出串操作后,指针指向最后操作的元素的下一个:退出串操作后,指针指向最后操作的元素的下一个元素元素
17、)重复前缀重复前缀重复前缀重复前缀 有的串操作指令前面可加上有的串操作指令前面可加上重复前缀重复前缀重复前缀重复前缀REPREP。当使用当使用REPREP前缀时,前缀时,该指令重复执行,该指令重复执行,重复执行次数由重复执行次数由CXCX决定决定(带有(带有REPREP前缀的前缀的串操作指令每执行一次,串操作指令每执行一次,CXCX自动减自动减1 1)。)。重复前缀重复前缀重复前缀重复前缀包括:包括:REPREP CX0 CX0 时重复执行时重复执行时重复执行时重复执行REPREPE E/REP/REPZ Z CX0CX0 ZF=1ZF=1时重复执行时重复执行时重复执行时重复执行REPREPN
18、ENE/REP/REPNZNZ CX0CX0 ZF=0ZF=0时重复执行时重复执行时重复执行时重复执行2525表表 4 5 串操作指令串操作指令2626串指令串指令使用使用的一般的一般方法方法:设置源串地址设置源串地址设置目标串地址设置目标串地址设置串长度设置串长度设置操作方向设置操作方向DF串指令串指令MOV SI,源串首地址源串首地址(或(或LEA SI,源串源串)MOV DI,目的串首地址目的串首地址(或(或LEA DI,目的串目的串)MOV CX,串长度串长度CLD(或(或STD)串指令串指令注意:DS与ES一般在完整程序的开始处设置,在此串指令的程序段中不必重复设置2727指令执行的
19、操作为:指令执行的操作为:MOVSMOVSB B:ES:DIDS:SIES:DIDS:SI SISISISI1,1,D DII DIDI11 MOVSMOVSW W:ES:DI+1DIDS:SI+1SIES:DI+1DIDS:SI+1SI SISI SISI2,2,D DII DIDI22 指令也可写成:指令也可写成:MOVSMOVS dest,srcdest,src(即无即无即无即无B B B B或或或或W W W W标识)标识)标识)标识)但要求:但要求:srcsrc用用DS:SIDS:SI寻址寻址,d destest用用ES:DIES:DI寻址寻址 传送是字节还是字传送是字节还是字,由操
20、作数的类型决定由操作数的类型决定串传送指令MOVSB/MOVSW2828串传送指令使用举例用串传送指令实现200个字节的数据传送:LEA SI LEA SI,MEM1MEM1 LEA DI LEA DI,MEM2MEM2 MOV CX MOV CX,200200 CLD CLD REPREP MOVS MOVSB B HLT HLT2929串比较指令CMPSB/CMPSW指令执行的操作为:CMPSBCMPSB:ES:DI-DS:SIES:DI-DS:SI SISISI1,DISI1,DI DI1 DI1 CMPSWCMPSW:ES:DI+1DI-DS:SI+1SIES:DI+1DI-DS:SI
21、+1SI SISI SI2,DISI2,DI DI2 DI2 比较的结果只反映在标志位上,串本身无变化。本指令可用来检查两个串是否相等。格式:格式:CMPS OPRD1,OPRD2 CMPSB CMPSW3030串比较指令举例 JZ STOP DEC SI MOV AL,SI MOV BX,SISTOP:HLT 测试内存中两块200个字节数据是否相同,并找出第一个不相等字符的地址,将该地址和字符存贮起来。LEA SI,MEM1LEA DI,MEM2MOV CX,200CLD REPE CMPSB 3131串扫描SCASB/SCASW执行的操作:对字节:ALES:DI DIDI1 对字:AXES
22、:DI1DI DI DI2搜索指令执行的仍是比较(减法)操作,结果只影响标志位。要搜索的关键字放在AL(字节)或AX(字)中。本指令用于在串中查找指定的信息。格式:格式:SCAS OPRD SCASB SCASW3232 SCAS指令加上重复前缀后,可对串进行连续扫描比较:若前缀为REPZ,则表示比较结果相等且(ZF=1)且串未结束(CX0),则继续比较。若前缀为REPNZ,则表示比较结果不相等(ZF=0)且串未结束(CX0)就继续比较。3333例:在ES段的偏移1000H开始处存有10个ASCII码。搜索E,若找到则记下搜索次数及存放地址,并在屏幕上显示Y;若未找到则显示N。(见右图)在屏幕
23、上显示一个字符的在屏幕上显示一个字符的指令段如下:指令段如下:(参见附录参见附录C.3 C.3 DOSDOS功能调用功能调用)MOV DL,MOV DL,MOV AH,2 MOV AH,2 INT 21H INT 21H 实现题目要求的程序段见下页:1000H414243444546ABCDF.ES段E3434 MOV DI,1000H MOV DI,1000H ;(DI)(DI)串偏移地址串偏移地址串偏移地址串偏移地址 MOV CX,0AH MOV CX,0AH ;(CX)(CX)串长度串长度串长度串长度 MOV AL,E MOV AL,E ;搜索关键字搜索关键字搜索关键字搜索关键字=E=E
24、 CLD CLD ;从低地址到高地址进行搜索从低地址到高地址进行搜索从低地址到高地址进行搜索从低地址到高地址进行搜索 REPREPNZNZ SCAS SCASB B ;若未找到若未找到若未找到若未找到,继续搜索继续搜索继续搜索继续搜索 JZ FOUND JZ FOUND ;找到找到找到找到,转至转至转至转至FOUND FOUND MOV DL,N MOV DL,N ;串中无串中无串中无串中无 EE,(DL)(DL)NN JMP DONE JMP DONE ;转至转至转至转至DONEDONEFOUND:DEC DI FOUND:DEC DI ;指针回退指针回退指针回退指针回退 MOV ADDR,
25、DI MOV ADDR,DI ;ADDRADDREE的地址的地址的地址的地址 SUB DI,1000HSUB DI,1000H MOV NUM,DI MOV NUM,DI ;NUMNUM搜索次数搜索次数搜索次数搜索次数 MOV DL,Y MOV DL,Y ;(DL)(DL)YYDONE:MOV AH,2DONE:MOV AH,2 INT 21H INT 21H ;显示字符;显示字符;显示字符;显示字符 HLT HLT 3535执行的操作为:执行的操作为:对字节:对字节:ALDS:SIALDS:SI SISI SISI11 对字:对字:AXDS:SI+1SIAXDS:SI+1SI SISISIS
26、I22 串装入指令通常不加重复前缀。串装入指令通常不加重复前缀。LODSLODSB B B B等价于等价于:LODSLODSW W W W等价于等价于:MOV AL,SIMOV AL,SI MOV AX,SI MOV AX,SI INC SI INC SIINC SI INC SI INC SI INC SI 串装入指令LODSB/LODSW格式:LODS OPRD LODSB LODSW363636H32H39H31HSTRING1STRING238H35H36H33H被加数加数数据段85629163SUM结果.07H07H02H06H265836196277 LEA SILEA SI,ST
27、RING1STRING1 LEA DI LEA DI,STRING2STRING2 LEA BX LEA BX,SUMSUM MOV CX MOV CX,4 4 CLC CLC AGAINAGAIN:MOV ALMOV AL,SISI ADC AL ADC AL,DI DI AAA AAA MOV BXMOV BX,AL AL INC SI INC SI INC DIINC DI INC BX INC BX DEC CX DEC CX JNZ AGAIN JNZ AGAIN 3737 下面要求将两个4字节的ASCII码数据求和,并将和的结果送显示。为此,要先化成ASCII码再送显示,程序段如下
28、:LEA SI,SUM+3 LEA SI,SUM+3 ;(SI)(SI)SUM+3SUM+3 MOV CX,4 MOV CX,4 ;(CX)(CX)和长度和长度和长度和长度 STDSTD ;置置置置DF=1,DF=1,减量修改减量修改减量修改减量修改SISI MOV AH,02 MOV AH,02 ;(AH)(AH)功能号功能号功能号功能号LP:LP:LODSLODSB B ;取取取取BCDBCD码至码至码至码至AL,AL,且且且且SISISI-1 SI-1 ADD AL,30H ADD AL,30H ;转换为转换为转换为转换为ASCIIASCII码码码码 MOV DL,ALMOV DL,AL
29、 ;(DL)(DL)字符字符字符字符 INT 21H INT 21H ;显示字符;显示字符;显示字符;显示字符 DEC CX DEC CX JNZ LP JNZ LP 3838指令的操作为:对字节:ES:DIAL DIDI1 对字:ES:DI+1DIAX DIDI2本指令用于把一块存储区域填充成某一初始本指令用于把一块存储区域填充成某一初始值值(即对存储区进行初始化即对存储区进行初始化)。存储区域的首地址要预先设置到存储区域的首地址要预先设置到ES:DIES:DI中。中。要存储到串中的数据要预先存到要存储到串中的数据要预先存到AL(AX)AL(AX)中。中。串存储指令STOSB/STOSW 格
30、式:格式:STOS OPRD STOSB STOSW3939例1:把从A000H开始的2KB内存单元清零。程序段如下:MOV DI,0A000H MOV AX,0 MOV CX,1024 CLD REP STOSW 4040例例2 2:把1000H开始的100个存储单元填入 ASCII码2AH(*)。程序段如下:MOV DI,1000HMOV DI,1000H ;首地址首地址 MOV AL,2AHMOV AL,2AH ;*=2AH*=2AH MOV CX,100MOV CX,100 ;重复执行重复执行100100次次 CLDCLD ;增量修改增量修改DIDI REPREP STOSSTOSB B MOV DI,1000H MOV CX,64H MOV AL,2AHAGAIN:MOV DI,AL INC DI DEC CX JNZ AGAIN HLT请对比4141