1朱亚萍zhuyp@hdu.edu.cn杭州电子科技大学自动化学院微机原理与接口技术2§3-38086的指令系统——逻辑运算和移位指令三、逻辑运算和移位指令指令的种类逻辑运算算术逻辑移位循环移位逻辑运算NOT取反AND逻辑乘(与)OR逻辑加(或)XOR异或TEST测试算术逻辑移位SHL/SAL逻辑/算术左移SHR逻辑右移SAR算术右移循环移位ROL循环左移ROR循环右移RCL通过进位的循环左移RCR通过进位的循环右移3§3-38086的指令系统——逻辑运算和移位指令1.逻辑运算指令(LogicalOperations)⑴NOT取反指令(LogicalNot)指令格式:NOT目的指令功能:目的目的取反操作数要求:①可以是8位或16位寄存器、存储器。②对于存储器操作,需指明是字还是字节。注意:指令执行后,对标志位无影响。例NOTAX;AXAX取反NOTBL;BLBL取反NOTBYTEPTR[BX];对存储单元字节内容取反后送回该单元4§3-38086的指令系统——逻辑运算和移位指令⑵AND逻辑与指令(LogicalAND)指令格式:AND目的,源指令功能:目的目的∧源主要用于使操作数的某些位保留(和“1”相与),而使某些位清除(和“0”相与)。⑶OR逻辑或指令(LogicalOR)指令格式:OR目的,源指令功能:目的目的∨源主要用于使操作数的某些位保留(和“0”相或),而使某些位置位(和“1”相或)。例MOVAX,3538HANDAX,0F0FH;AX0508HORAX,3030H;AX3538H5§3-38086的指令系统——逻辑运算和移位指令⑷XOR异或操作指令(ExclusiveOR)指令格式:XOR目的,源指令功能:目的目的∨源主要用于使操作数的某些位保留(和“0”相异或),而使某些位取反(和“1”相异或)⑸TEST测试指令(Test)指令格式:TEST目的,源指令功能:目的∧源逻辑与操作,并修改标志位,但不回送结果,两个操作数都不变。6§3-38086的指令系统——逻辑运算和移位指令对AND、OR、XOR和TEST指令的说明:▲源操作数可以是8位或16位立即数、寄存器、存储器;▲目的操作数只能是寄存器、存储器,两操作数不能同时为存储器;▲指令执行后,均将CF和OF清零,ZF、SF和PF反映操作结果,AF未定义。例设AL寄存器中存有报警标志。若D7=1,表示温度报警,程序要转到温度报警处理程序T_ALARM;D6=1,则转压力报警程序P_ALARM。用TEST指令来实现这种功能。解:TESTAL,80H;查AL的D7=1?JNZT_ALARM;是1(非零),则转温度报警程序TESTAL,40H;D7=0,D6=1?JNZP_ALARM;是1,转压力报警7§3-38086的指令系统——逻辑运算和移位指令2.算术逻辑移位指令(ShiftArithmeticandShiftLogical)这类指令可对寄存器、存储器中的字或字节的各位进行算术移位或逻辑移位,移位的次数由指令中的计数值决定。移位指令的操作示意图如下:CFMSBLSB0SHL/SAL算算/算算算算CFMSBLSBSHR算算算算0CFMSBLSBSAR算算算算8§3-38086的指令系统——逻辑运算和移位指令⑴SAL算术左移指令(ShiftArithmeticLeft)指令格式:SAL目的,计数值⑵SHL逻辑左移指令(ShiftLogicLeft)指令格式:SHL目的,计数值指令功能:以上两条指令的功能完全相同,均将寄存器或存储器中的目的操作数的各位左移,每移一次,最低有效位LSB补0,而最高有效位MSB进入标志位CF。例MOVAH,06H;AH=60HSALAH,1;将AH的内容左移1次,AH=0CHMOVCL,03HSHLDI,CL;将DI的内容左移3次SALBYTEPTR[BX];将内存单元的字节左移1位9§3-38086的指令系统——逻辑运算和移位指令注意:▲移动一次,相当于将目的操作数乘以2;▲计数值就是所要移位的次数。•若移位一次,直接将计数值置1;•移位次数大于1,将移位次数送进CL,再把CL放在计数值位置上。▲对标志位的影响:•移位次数为1时,若移位后最高位的值被改变,OF置1,否则OF清0。多次移位时,OF的值不确定。•不论移多少次,CF总是等于目的操作数最后被移出去的值。SF和ZF将根据指令执行后目的操作数的状态来决定,PF只有当目的操作数在AL中时才有效,AF不定。10§3-38086的指令系统——逻辑运算和移位指令⑶逻辑右移指令(ShiftLogicRight)指令格式:SHR目的,计数值指令功能:各位进行右移。每移一次,低位进入CF,最高位补0。注意:若目的操作数为无符号数,每右移一次,目的操作数除以2,余数被丢掉。例用右移的方法作除法133/8=16…5。解:MOVAL,10000101B;AL=133MOVCL,03H;CL=移位次数SHRAL,CL;右移3次指令执行后,AL=10H=16,余数5被丢失。标志位CF、AF不定。11§3-38086的指令系统——逻辑运算和移位指令⑷SAR算术右移指令(ShiftArithmeticRight)指令格式:SAR目的,计数值指令功能:各位右移。每移位一次,最低位进入CF,但最高位(即符号位)保持不变。注意:每移一次,相当于对带符号数进行除2操作。例用SAR指令计算-128/8=-16。解:MOVAL,10000000B;AL=-128MOVCL,03H;右移次数3SARAL,CL;算术右移3次后,AL=0F0H=-1612§3-38086的指令系统——逻辑运算和移位指令3.循环移位指令(Rotate)算术逻辑移位指令,移出操作数的数位均被丢失;循环移位指令把操作数从一端移到另一端,移出的位不丢失。循环移位指令共四条:操作如图所示。⑴ROL循环左移指令(RotateLeft)指令格式:ROL目的,计数值⑵ROR循环右移指令(RotateRight)指令格式:ROR目的,计数值⑶RCL通过进位位循环左移(RotatethroughCarryLeft)指令格式:RCL目的,计数值⑷RCR通过进位位循环右移(RotatethroughCarryRight)指令格式:RCR目的,计数值13§3-38086的指令系统——逻辑运算和移位指令循环移位指令操作示意图:CFMSBLSBROL算算算算CFMSBLSBRCL算算算算算算算算算算CFMSBLSBROR算算算算CFMSBLSBRCR算算算算算算算算算算14§3-38086的指令系统——逻辑运算和移位指令注意:循环移位后:结果→目的操作数。目的操作数可以是8/16位的寄存器、存储器,移位的次数可以是1,也可以由CL寄存器的值指定。关于标志位:ROL和ROR指令没有把进位标志CF包含在循环中;而RCL和RCR指令把CF作为整个循环的一部分,一起参加循环移位。CF的值总是由最后一次被移出的值决定。OF位只有在移位次数为1的时候才有效。在移位后最高有效位发生变化(由1变0或由0变1)时,则OF置1,否则OF置0。在多位循环移位时,OF值不确定。15§3-38086的指令系统——逻辑运算和移位指令例ROLBX,CL;BX中的内容不带进位位左移CL中规定的次数RORWORDPTR[SI],1;DS×16+SI单元的字不带进位移1次例设CF=1,AL=10110100B若执行ROLAL,1;则AL=01101001B,CF=1,OF=1若执行RORAL,1;则AL=01011010B,CF=0,OF=1若执行RCRAL,1;则AL=11011010B,CF=0,OF=0若执行MOVCL,3RCLAL,CL;则AL=10100110B,CF=1,OF不确定16§3-38086的指令系统——字符串处理指令相关概念字符串:一系列存放在存储器中的字或字节数据,不管它们是不是ASCII码。字符串长度可达64K字节。字符串元素:组成字符串的字节或字。每种字符串指令对字符串元素只进行同一种操作。字符串操作指令:对字符串进行的传送、比较、扫描、存储及装入等5种操作。四、字符串处理指令17§3-38086的指令系统——字符串处理指令字符串操作指令的类型和格式指令名称字节/字操作字节操作字操作字符串传送字符串比较字符串扫描字符串装入字符串存储MOVS目的串,源串CMPS目的串,源串SCAS目的串LODS源串STOS目的串MOVSBCMPSBSCASBLODSBSTOSBMOVSWCMPSWSCASWLODSWSTOSW18§3-38086的指令系统——字符串处理指令说明:每种指令都有3种格式。有两种方法用以说明是字节操作还是字操作。方法一:用指令中的源串和目的串名(即操作数)来表明是字节还是字;方法二:在指令助记符后加B说明是字节,加W说明是字操作。19§3-38086的指令系统——字符串处理指令关于隐合约定:①源串:起始地址(或末地址)为DS:SI。源串允许使用段超越前缀来修改段地址。②目的串:起始地址(或末地址)为ES:DI。目的串不允许使用段超越前缀修改ES。如果要在同一段内进行串运算,必须使DS和ES指向同一段。③指针:每执行一次字符串指令,指针SI和DI会自动修改,以指向下一个待操作单元。20§3-38086的指令系统——字符串处理指令④DF标志:控制字符串处理的方向。DF=0为递增方向。DS:SI指向源串首地址,每执行一次串操作:字节串操作时,SI、DI分别增1;字串操作时,SI和DI分别增2;DF=1为递减方向。DS:SI指向源串末地址,每执行一次串操作:字节串操作时减1;字串操作时减2。STD指令使DF置1,CLD指令将DF清0。⑤串长度:要处理的字符串长度(字节或字数)放在CX寄存器中。21§3-38086的指令系统——字符串处理指令关于重复前缀:①功能在基本指令前加重复前缀,可加快串运算指令的执行速度。每重复执行一次,地址指针SI和DI按方向标志自动修改,CX的值自动减1。②类型与格式REP:无条件重复(Repeat),常与MOVS连用,连续传送字符串。直到传送完毕,即CX=0为止。REPE/REPZ:相等/结果为零则重复(RepeatwhileEqual/Zero),常与CMPS连用,连续比较字符串。当两个字符串相等(ZF=1)和CX≠0时,则重复进行比较,直到ZF=0或CX=0为止。22§3-38086的指令系统——字符串处理指令REPNE/REPNZ:不相等/结果非零则重复(RepeatwhileNotEqual/NotZero),常与SCAS连用,当结果非0(ZF=0)和CX≠0时,重复进行扫描,直到ZF=1或CX=0为止。带有重复前缀的串指令执行过程中允许有中断进入。23§3-38086的指令系统——字符串处理指令1.MOVS字符串传送指令(MoveString)指令格式:MOVS目的串,源串指令功能:SI作指针的源串中的一个字节或字→DI作指针的目的串;自动修改指针SI和DI。应用:▲解决MOV指令不能直接在存储单元间进行数据传送的问题。▲若使用重复前缀,还可以利用一条指令传送一批数据。例要求把数据段中以SRC_MESS为偏移地址的一串字符“HELLO!”,传送到附加段中以NEW_LOC开始的单元中。24§3-38086的指令系统——字符串处理指令DATASEGMENT;数据段SRC_MESSDB‘HELLO!’;源串DATAENDSEXTRASEGMENT;附加段NEW_LOCDB6DUP(?);存放目的串EXTRAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:EXTRASTART:MOVAX,DATAMOVDS,AX;DS=数据段段址MOVAX,EXTRAMOVES,AX;ES=附加段段址25§3-38086的指令系统——字符串处理指令LEASI,SRC_MESS;SI指向源串偏移地址LEADI,NEW_LOC;DI指向目的串偏移地址MOVCX,6;CX作串长