1.5k likes | 1.74k Views
及接口技术. 微型计算机原理. 授课教师:. 3 . 3 .3 逻辑运算与移位指令. 8086/8088CPU 的指令系统提供 8 位和 16 位的逻辑运算与移位指令有 3 组. 逻辑运算指令 AND/OR/XOR/NOT/TEST 移位指令 SHL/SHR/SAL/SAR 循环移位指令 ROL/ROR/RCL/RCR. 3 . 3 .3 逻辑运算与移位指令. 一、逻辑运算指令. 8086/8088CPU 的逻辑运算指令有 AND 、 OR 、 XOR 、 TEST 、 NOT 5 条指令。
E N D
及接口技术 微型计算机原理 授课教师:
3.3.3逻辑运算与移位指令 8086/8088CPU的指令系统提供8位和16位的逻辑运算与移位指令有3组 • 逻辑运算指令 AND/OR/XOR/NOT/TEST • 移位指令 SHL/SHR/SAL/SAR • 循环移位指令 ROL/ROR/RCL/RCR
3.3.3逻辑运算与移位指令 一、逻辑运算指令 8086/8088CPU的逻辑运算指令有AND 、OR、XOR、TEST、NOT 5条指令。 以上5条除NOT对标志位不产生影响; 其余均产生影响:这些指令根据各自逻辑运算的结果都将影响SF、ZF、和PF,同时AF的值不确定。
注释:①操作数格式同加减法指令;②设CF=OF=0,影响SF、ZF、PF,对AF无定义。注释:①操作数格式同加减法指令;②设CF=OF=0,影响SF、ZF、PF,对AF无定义。 3.3.3逻辑运算与移位指令 一、逻辑运算指令 1、与运算指令AND 指令格式及操作 AND DST ,SRC;(DST) ( DST )Λ(SRC)
3.3.3逻辑运算与移位指令 AND的指令可以屏蔽某些不关心的位(该位置0),保留一些有用的位。为了做到这一点,只需把要屏蔽位和“0”进行逻辑位,而将保留的位与“1”进行逻辑与即可。
3.3.3逻辑运算与移位指令 2、或运算指令OR OR DST ,SRC; (DST) ( DST )V(SRC) 注释:①操作数格式同加减法指令;②设CF=OF=0,影响SF、ZF、PF,对AF无定义。
3.3.3逻辑运算与移位指令 OR常见用途:把某些特定的位 置1。方法:把要置1的位与1按位逻辑或;不改变的位与0按位逻辑或。
3.3.3逻辑运算与移位指令 OR与AND的共性:如果寄存器与其自身内容进行逻辑与操作,或进行逻辑或操作,寄存器内容不变,但逻辑运算结果影响SF、ZF、PF标志位,且将CF清0。 利用这个特性,可以在数据传送指令之后,进行逻辑运算以影响标志位,然后可以判断数据的正负、是否为0,以及数据的奇偶性等。
3.3.3逻辑运算与移位指令 3、异或运算指令XOR 指令格式及操作 XOR DST ,SRC; (DST) ( DST )⊕(SRC) 注释:①操作数格式同加减法指令;②设CF=OF=0,影响SF、ZF、PF,对AF无定义。
3.3.3逻辑运算与移位指令 XOR常见用途一:寄存器某些特定的位“求反”,而使其余的位不变。因此‘求反’的位与1‘异或’;不变的位与0进行“异或”。 MOV AL ,0FFH ; XOR AL,55H; AL=10101010B, 55H=01010101B
3.3.3逻辑运算与移位指令 XOR常见用途二:寄存器内容清0 XOR AX,AX; XOR BX ,BX;在初始化时,将寄存器清0 如: 0010 1001B = AX XOR)0010 1001B = AX 0000 0000B
3.3.3逻辑运算与移位指令 XOR常见用途三:用来测试某一操作数是否与另操作数相等,例如检查AX的内容是否等于0F00H,若相等则转MATCH去执行,否则顺序执行。程序段如下: XOR AX,0F00H; JZ MATCH ;JZ为跳转指令 表示AX为0时转移 :
3.3.3逻辑运算与移位指令 4、测试指令TEST 指令格式及操作 TEST DST ,SRC; ( DST ) &(SRC) DST:可以为寄存器操作数、存储器操作数 SRC:可以为寄存器操作数、存储器操作数、立即数 指令功能:目标操作数与源操作数按位“逻辑与”运算,结果不送回目标操作数。置CF=0,OF=0;对其他标志没有定义。
3.3.3逻辑运算与移位指令 TEST指令用于位的测试,它与条件转移指令一起,共同完成对特定位的状态的判断,并实现相应程序的的转移。 与CMP有些类似,CMP比较两个操作数,TEST比较特定的位。 测试方法:要测试操作数的的某些位是否为0,只需要把TEST的源操作数设置成一个立即数,其中需要测试的位设为1。
3.3.3逻辑运算与移位指令 MOV AL,40H; TEST AL, 0AH ; JNZ NEST;JNZ为跳转指令 表示ZF=0时转移 : NEST:…..
3.3.3逻辑运算与移位指令 5、取反指令 NOT 指令格式及操作 NOT OPR ; (OPR) (OPR) OPR:除了立即数以外的各种寻址方式 的操作数、寄存器。 指令功能:对操作数按位取反。NOT指令是一条逻辑“非”指令,只有一个操作数,可以是8位,也可以是16位的存储器或寄存器。 对标志位没有影响。
3.3.3逻辑运算与移位指令 分析指令功能 NOT AL ; NOT DX NOT BYTE PTR 0002H[BX ] NOT WORD PTR [BX+SI]
3.3.3逻辑运算与移位指令 二、移位指令(shift) 对应同一条机器指令 8086/8088 CPU有4条移位指令。 算术左移指令SAL逻辑左移指令SHL 算术右移指令SAR 逻辑右移指令SHR 功能:用来实现对寄存器或存储单元的8位或16位数据的移位,指令移位操作可以是向左或向右移一位,也可以是多位,移多位时,规定移位的次数必须放在CL寄存器中。
3.3.3逻辑运算与移位指令 1、逻辑左移指令 SHL /算术左移指令 SAL 指令格式: SHL(SAL) OPR,CNT; 只影响CF、OF两个标志位。 OPR:通用寄存器或存储器操作数 CNT:可为1,或CL,CL中放移位的次数。 指令功能:操作数左移1位或CL规定的位数,最低位补0, 最高位进CF。
3.3.3逻辑运算与移位指令 逻辑左移指令 SHL /算术左移指令 SAL D15/D7 D0 CF MSB LSB 0 SHL/SAL指令示意图 SHL/SAL功能完全一样,因为对一个无符号数乘以2和对一个有符号数乘以2没有什么区别。 在左移位数为1的情况下,如果最高位与CF不同,则溢出标志OF=1,这对带符号数可以判断移位前后的符号位不同;反之,如果最高位与CF相同,则溢出标志OF=0,这表示移位前后符号位没有改变。 在移位次数为多次,则OF值不确定。
3.3.3逻辑运算与移位指令 分析指令功能 SHL AL ; SHL CL; SHL WORD PTR [BX+100],1 左移1位相当于乘2,因此可以代替某些常数的运算,并且速度很快。 分析170书中例3.11
3.3.3逻辑运算与移位指令 2、逻辑右移指令 SHR 指令格式: SHR OPR,CNT; 只影响CF、OF两个标志位。 OPR:通用寄存器或存储器操作数 CNT:可为1,或CL,CL中放移位的次数。 指令功能:操作数右移1位或CL规定的位数,最低位进CF。 最高位补0,
3.3.3逻辑运算与移位指令 逻辑右移指令 SHR D15/D7 D0 0 MSB LSB CF SHR指令示意图 在右移位数为1的情况下,移位后如果最高位与次高位不相等,则溢出标志OF=1,否则0F=0,这表示符号位在移位前后有没有改变。 在移位次数为多次,则OF值不确定。
3.3.3逻辑运算与移位指令 分析指令功能 SHR AL ,1 ; SHR AX,CL; SHR BYTE PTR[BX+SI]; SHR WORD PTR BUFFER,CL 逻辑右移1位相当于无符号数除以2,因此可以代替某些常数的运算,并且采用移位指令比除法指令时执行速度要快得多。
3.3.3逻辑运算与移位指令 [例3.12 ]将一个16位无符号数除以512,结果仍放回原单元。该数原来存放在以TDATA 为首地址的两个连续的存储单元中。 分析: TDATA 512=( TDATA 2 ) 256 因此用逻辑右移完成上述除法运算。编程如下: MOV AX,TDATA SHR AX,1 XCHG AL,AH;右移8位,商放AL中。 AND AX, 00FFH MOV TDATA ,AX HLT
3.3.3逻辑运算与移位指令 4、算术右移指令 SAR D15/D7 D0 CF MSB LSB SAR指令示意图
3.3.3逻辑运算与移位指令 SAR AL ,1 SAR AX, CL SAR WORD PTR 100[SI],1 SAR BYTE PTR DATA[SI+BX],CL 算术右移1位,相当于带符号数除以2 MOV AX,0064H SAR AX,1
3.3.3逻辑运算与移位指令 三、循环移位指令( rotate shift) 8086/8088 CPU有4条循环移位指令。 不带进位标志CF的左循环移位指令ROL 不带进位标志CF的右循环移位指令ROR 带进位的左循环移位指令RCL 带进位的右循环移位指令RCR 循环移位指令的操作数与移位指令相同。
3.3.3逻辑运算与移位指令 1、循环左移指令ROL(rotate left) 只影响CF、OF两个标志位。 指令格式: ROL OPR,CNT; 指令功能:操作数向左循环移1位或CL规定的位数,最高位移进CF,同时最高位移进最低位形成循环,进位标志不在循环回路之内。
CF MSB LSB ROL指令操作示意图 ROL指令影响CF、OF两个标志位。 在循环移位为1的情况下,移位后如果最高位与CF不相等,则溢出标志OF=1,否则OF=0,因此OF的值表示符号位在移位前后有没有改变。 在移位次数为多次,则OF值不确定。
分析指令功能 ROL AH ,1 ROL BX ,CL ROL WORD PTR[DI],CL ROL BYTE PTR [BX],1
3.3.3逻辑运算与移位指令 2、循环右移指令ROR(rotate right) 只影响CF、OF两个标志位。 指令格式: ROR OPR,CNT; 指令功能:操作数向右循环移1位或CL规定的位数,最低位移进CF,同时最低位移进最低位形成循环,进位标志不在循环回路之内。
CF MSB LSB 3.3.3逻辑运算与移位指令 2、循环右移指令ROR(rotate right) ROR指令操作示意图 ROR指令影响CF、OF两个标志位。 在循环移位为1的情况下,移位后如果新的最高位与次高位不等,则溢出标志OF=1,否则OF=0。 在移位次数为多次,则OF值不确定。
分析指令功能 ROR BX,1 ROR AX, CL ROR BYTE PTR [BX],1 ROR WORD PTR[DI],CL
CF MSB LSB RCL指令操作示意图 3.3.3逻辑运算与移位指令 3、带进位循环左移指令RCL(rotate left through carry) 指令格式: RCL OPR,CNT; 指令功能:将目标操作数连同进位标志CF一起向左循环移动一位或由CL寄存器指定的位数。最高位移入进位标志CF ,而CF移入最低位。
3.3.3逻辑运算与移位指令 3、带进位循环左移指令RCL(rotate left through caary) RCL AX,1 RCL AH,,CL RCL WORD PTR[DI],1 RCL BYTE PTR [SI+BP],CL 分析指令功能 RCL指令影响CF、OF两个标志位。 在循环移位次数为1的情况下,左移位后如果新的最高位与CF不等,则溢出标志OF=1,否则OF=0。 在移位次数为多次,则OF值不确定。
CF MSB LSB RCR指令操作示意图 3.3.3逻辑运算与移位指令 4、带进位循环左移指令RCR(rotate right through caary) 指令格式: RCR OPR,CNT; 指令功能:将目标操作数连同进位标志CF一起向右循环移动一位或由CL寄存器指定的位数。最低位移入进位标志CF ,而CF移入最高位。
3.3.3逻辑运算与移位指令 RCR AH,1 RCR DI,CL RCR BYTE PTR[BX],1 RCR WORD PTR [SI+BX],CL 分析指令功能
3.3.3逻辑运算与移位指令 4条循环移位指令rotate与 4条移位指令shift比较 1、循环移位指令,使得各个位的信息不丢失,只是移动到其他位或进位标志CF上,必要时可以恢复。 2、利用循环移位指令可以对任何一位进行测试。 例如:测试AL的第6位是0还是1? MOV CL, 2 ROL AL,CL JNC ZERO ;CF=0,转ZERO : ZERO :
3.3.4 串操作指令 数据串(数据块):在内存区域内连续存放着若干个字节(或若干个字)数据(或字符的ASCII码),这样的一组数据称为数据串(数据块)。 字节串:若每个数组元素是字节型,则为字节串。 字串:若给个数组元素是字型,则称字串。
3.3.4 串操作指令 8086/8088 CPU有一组十分有用的串操作指令,这些指令的操作对象不只是单个字节或字,而是内存中地址连续的字节串或字串。每次操作后能自动修改地址为下一次操作作好准备。 串操作指令有8条,其中5条为基本操作指令,3条为重复前缀串操作指令。
3.3.4 串操作指令 串操作指令格式各不相同,但有以下共同特点: (1)可以对字节串进行操作,也可以对字串进行操作。 (2)串操作指令用SI寄存器寻址源操作数,用DI寻址目标操作数,源操作数的隐含段寄存器为DS,但允许但超越;目标操作数隐含的段寄存器ES,但不允许段超越。 (3)每一次操作后修改地址指针是增还是减量取决于方向标志DF。DF=0,地址指针自动增量修改,DF=1,地址指针自动减量修改。因此每次串操作指令执行前都要设置DI、SI,并把数组元素的个数设置在CX中。
3.3.4 串操作指令 (4)有的串操作指令可以加重复前缀REP,可使串操作重复进行到结束,重复循环的次数由寄存器CX决定,其执行过程相当于一个循环程序的运行,重复执行后DI、SI都被自动修改。但指令指针IP仍保持指向前缀的地址,直至寄存器CX的内容为0,则退出串操作指令。 (5)串操作汇编指令的格式可以 写上操作数,也可以在指令操作数后加字母‘B’或“W”。加上字母“B”“W”后指令助记符后面不允许写操作数。 (6)串操作指令可以与重复前缀指令结合,进行多次重复操作。
3.3.4 串操作指令 一、串传送指令 MOVS (MOVE string ) 指令格式及操作: MOVS DST ,SCR;(ES:DI) (DS:SI) DF=0,增址; DF=1,减址; 指令功能:将一个字节串或字串从DS段由SI指向存储器某一区域传送到位于ES由DI所指向存储器的另一个区域,然后根据方向DF自动修改地址指针SI和DI。
3.3.4 串操作指令 MOVSB ;字节传送操作,( (ES:DI) (DS:SI) SI SI + 1,DI DI +1 ) MOVSW ;字节传送操作,( (ES:DI) (DS:SI) SI SI + 1,DI DI +1 ) 若方向标志位DF=0,取“+”号;DF=1,取“—”号。 该指令不影响标志位
90H 78H 56H 34H 12H 00H 00H 00H 00H 00H 3.3.4 串操作指令 一、串传送指令 MOVS (MOVE string )
3.3.4 串操作指令 一、串传送指令 MOVS (MOVE string ) 第一种方法
3.3.4 串操作指令 二、存储数据串指令 STOS (store string) 指令格式及操作: STOS SCR;(ES:DI) AX/AL 也可以表示为字节或字存储形式: STOSB ;字节存储数据串指令及操作: (ES:DI) AL,DI DI+1 STOSW ;字存储数据串指令及操作: (ES:DI) AX,DI DI+2
3.3.4 串操作指令 指令功能:将累加器AX或AL的值送到ES段由DI所指字符串的内存单元中,并且自动修改地址指针。若方向标志DF=0,取“+”号;DF=1,取“—”号。 注释:1)经常用来初始化一段内存区域。 2)串为目的操作数。 3)不影响标志。