位操作类指令

  • 位操作类指令以二进制位为基本单位进行数据的操作;这是一类常用的指令,都应该特别掌握
  • 注意这些指令对标志位的影响
    • 逻辑运算指令 AND OR XOR NOT TEST
    • 移位指令 SHL SHR SAR
    • 循环移位指令 ROL ROR RCL RCR

逻辑运算指令

1
2
3
4
5
mov ax,-1
and ax,8000h ;某位清0
or ax,1 ;某位置1
xor ax,0fh ;某位取反
not ax

运行结果

image-20240808222931772

移位指令

  • SHL(逻辑左移(无符号))
  • SHR(逻辑右移(无符号))
  • SAL(算术左移(有符号))(同SHL
  • SAR(算术右移(有符号))
1
2
3
4
mov ax,0fh
sar ax,1
shl ax,1
shr ax,1

运行结果(若最高位为0则算术右移后也补0)

image-20240808224035986

1
2
mov ax,0ffffh
sar ax,1

若最高位为1则算术右移后也补1

image-20240808224544696

循环移位指令(rotate)

  • 将操作数从另一端溢移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作

    image-20240808225149140

    image-20240808225231796

循环移位指令对标志的影响

  • 按照指令功能设置进位标志CF

  • 不影响SF、ZF、PF、AF

  • 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后的操作数最高位不同(有变化),则OF=1;否则OF=0。当移位次数大于1时,OF不确定

    image-20240808225718510

    image-20240808225802320

    image-20240808230507028

    image-20240808230547697

    image-20240808230640347

当移位次数超过1时要将移位次数存到cl(shl等同理)

1
2
3
4
mov cl,8
mov ax,1234h
rol ax,cl
ror ax,cl

运行结果

image-20240808231005383

1
2
3
4
5
;带进位循环移位 32位
mov ax,0ffffh ;低位
mov bx,0ffffh ;高位
shl ax,1
rcl bx,1

运行结果

image-20240808231231211