8086指令系统之逻辑运算和移位指令
前置问题:
- 如何对一个8位的操作数进行:按位清零、按位置一和按位取反?
- 程序初始化之前,常常会对AX寄存器清零,一般会用
XOR AX, AX
而不是用MOV AX, 0H
,为什么? - 算数移位和逻辑移位有何差别?为什么算数右移要这么设计?和补码有什么关系?
TEST
指令通常在什么情况下使用?
逻辑运算指令
NOT 取反指令
指令格式:NOT 目的操作数
指令功能:目的
目的操作数可以是8或者是16位寄存器或者存储器,对于存储器需要用PTR说明类型
AND 逻辑与指令
指令格式:AND 目的, 源
指令功能:目的
可以用于保留、清楚操作数的某些位
对标志位的影响
指令执行之后,将CF和OF清零,ZF、SF和PF反映操作结果,AF未定义,源操作数不变
OR 逻辑或指令
指令格式:OR 目的, 源
指令功能:目的
可以用于保留、清楚操作数的某些位
XOR 异或指令
指令格式:XOR 目的, 源
指令功能:对两个操作数进行按位异或,结果送回目的操作数
可以用于保留、清楚操作数的某些位
TEST 测试指令
指令格式:TEST 目的, 源
指令功能:目的"与"源,并修改标志位,但不回送结果
算数逻辑移位指令
SAL 算数左移指令
Shift Arithmetic Left
指令格式:SAL 目的, 计数值
SHL 逻辑左移指令
Shift Logic Left
指令格式:SHL 目的, 计数值
指令功能:以上两条指令的功能完全相同
- 均将目的操作数各位左移,每移动一次,最低位LSB补0,最高位MSB进标志CF。移动一次,相当于将MSB进标志位CF。移动一次,相当于将目的操作数乘以2
- 计数值表示移位次数,可以是1,如果大于1,则用CL存放,并要事先将次数存入CL
- 移位次数最多为31(0001111B)
SHR 逻辑右移指令
Shift Logic Right
指令格式:SHR 目的, 计数值
指令功能:使目的操作数各位右移,每移一次,最低位进入CF,最高位补0
右移次数由计数值决定,同SAL/SHL一样
若目的操作数为无符号数,每右移一次,使目的操作数除以2
SAR 算数右移指令
Shift Arithmetic Right
指令格式:SAR 目的, 计数值
指令功能:每移位一次,最低位进入CF,但最高位(符号位)保持不变,而不是补0。相当于对带符号数进行除2
循环移位指令(Rotate)
算数移位指令,一处的操作数数位均丢失。循环移位指令则把数位从操作数的一端移向另一端,从操作数中移走的位不会丢失
ROL 循环左移指令
Rotate Left
指令格式:ROL 目的, 计数值
ROR 循环右移指令
指令格式:ROR 目的, 计数值
RCL 通过进位位循环左移
Rotate thru Carry Left
指令格式:`RCL 目的, 计数值
RCR 通过进位位循环右移
Rotate thru Carry Right
指令格式: RCR 目的, 计数值
循环移位指令特点
- 目的操作数可以使8/16位的寄存器操作数或内存操作数,计数值含义同上,即由1或者CL指定
- ROL和ROR位小循环移位指令,没有把CF包含在循环中;RCL、RCR位大循环指令,把CF作为整个循环的一部分参加循环移位
- CF的值由最后一次被移出的值决定