8086指令系统之逻辑运算和移位指令

前置问题:

  1. 如何对一个8位的操作数进行:按位清零、按位置一和按位取反?
  2. 程序初始化之前,常常会对AX寄存器清零,一般会用XOR AX, AX而不是用MOV AX, 0H,为什么?
  3. 算数移位和逻辑移位有何差别?为什么算数右移要这么设计?和补码有什么关系?
  4. 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 目的, 计数值

指令功能:以上两条指令的功能完全相同

  1. 均将目的操作数各位左移,每移动一次,最低位LSB补0,最高位MSB进标志CF。移动一次,相当于将MSB进标志位CF。移动一次,相当于将目的操作数乘以2
  2. 计数值表示移位次数,可以是1,如果大于1,则用CL存放,并要事先将次数存入CL
  3. 移位次数最多为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 目的, 计数值

循环移位指令特点

  1. 目的操作数可以使8/16位的寄存器操作数或内存操作数,计数值含义同上,即由1或者CL指定
  2. ROL和ROR位小循环移位指令,没有把CF包含在循环中;RCL、RCR位大循环指令,把CF作为整个循环的一部分参加循环移位
  3. CF的值由最后一次被移出的值决定