三、逻辑运算和移位指令(包括逻辑运算、移位和循环移位指令) 1.逻辑运算指令 (1) 一般格式 NOT OPRD 功 能 对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。例如:NOT AL (2) 一般格式:AND OPRD1,OPRD2 功 能 对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。 其中目的操作数OPRD1可以是累加器、任一通用寄存器,或内存操作数(所有寻址方式)。源操作数OPRD2可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。 8086/8088的AND指令可以进行字节操作,也可以进行字操作。 【例如】 AND AL,0FH ;可完成拆字的动作 AND SI,SI ; 将SI清0 (3) 一般格式 TEST OPRD1,OPRD2 功 能 完成与AND指令相同的操作,结果反映在标志位上,但并不送回。通常使用它进行测试, 【例如】 若要检测 AL中的最低位是否为1,为1则转移。可用以下指令: TEST AL,01H JNZ THERE …… THERE: 若要检测CX中的内容是否为0,为0则转移。该如何做呢? (4) 一般格式 OR OPRD1,OPRD2 功 能 对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。 其中,目的操作数OPRD1,可以是累加器,可以是任—通用寄存器,也可以是一个内存操作数(所有寻址方式)。源操作数OPRD2,可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。 AND AL,0FH AND AH,0FOH OR AL,AH ; 完成拼字的动作 OR AX,0FFFH ;将AX低12位置1 OR BX,BX ; 清相应标志 (5) 一般格式 XOR OPRD1,OPRD2 功 能 对两个指定的操作数进行“异或”运算,结果送回目的操作数。 其中,目的操作数OPRD1可以是累加器,可以是任一个通用寄存器,也可以是一个内存操作数(全部寻址方式)。源操作数可以是立即数、寄存器,也可以是内存操作数(所有寻址方式)。【例如】 XOR AL,AL ;使AL清0 XOR SI,SI ;使SI清0 XOR CL,0FH ;使低4位取反,高4位不变 逻辑运算类指令中,单操作数指令NOT的操作数不能为立即数,双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,且目的操作数不能为立即数。它们对标志位的影响情况如下:NOT不影响标志位,其它四种指令将使CF=OF=0,AF无定义,而SF、ZF和PF则根据运算结果而定。
2.移位指令 (1) 算术/逻辑移位指令 ①算术左移或逻辑左移指令 SAL/SHL OPRD,M ; ②算术右移指令 SAR OPRD,M ③逻辑右移指令 SHR OPRD,M M是移位次数,可以是1或寄存器CL 这些指令可以对寄存器操作数或内存操作数进行指定的移位,可以进行字节或字操作;可以一次只移1位,也可以移位由寄存器CL中的内容规定的次数 (2) 循环移位指令 ROL OPRD,M ;左循环移位 ROR OPRD,M ;右循环移位 RCL OPRD,M ;带进位左循环移位 RCR OPRD,M ;带进位右循环移位 前两条循环指令,未把标志位CF包含在循环的环中,后两条把标志位CF包含在循环的环中,作为整个循环的一部分。 循环指令可以对字节或字进行操作。操作数可以是寄存器操作数,也可以是内存操作数。可以是循环移位一次,也可以循环移位由CL的内容所决定的次数。 左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2。右移—位相当于除以2。
在数的输入输出过程中乘10的操作是经常要进行的。而X10=X*2+X*8,也可以采用移位和相加的办法来实现*10。为保证结果完整,先将AL中的字节扩展为字。 MOV AH,0 SAL AX,1 ;X*2 MOV BX,AX ;移至BX中暂存 SAL AX,1 ;X*4 SAL AX,1 ;X*8 ADD AX,BX ;X*10 【例1】BCD码转换为ASCII码 若在内存某一缓冲区中存放着若干个单元的用BCD码表示的十进制数。每—个单元中放两位BCD码,要求把它们分别转换为ASCII码。高位的BCD码转换完后放在地址较高的单元。 分析:转换公式:ASCII=BCD+30H 算法:源串和目的串的表首分别设两个指针。取BCD转ASCII后存入(先低位,后高位) MOV SI,OFFSET BCDBUFF;设置源地址指针 MOV CX,COUNT ;设计数初值 MOV DI,OFFSET ASCBUF ;设置目的地址指针 AGAIN:MOV AL,[SI] MOV BL,AL AND AL,0FH ;取低位BCD码 OR AL,30H ;转换成ASCII码 MOV [DI],AL ;存入 INC DI ;修改指针 MOV AL,BL PUSH CX MOV CL,4 SHR AL,CL OR AL,30H ;高位转换成ASCII码 MOV [DI],AL ;存入 POP CX INC DI INC SI ;修改指针 LOOP AGAIN ;重复工作
|
电工学习网 ( )
GMT+8, 2021-12-6 20:45