【微机原理】汇编指令之位操作指令

 一、逻辑指令

除了NOT指令不对符号位有影响,ANDORXORTEST对符号标志为影响都一样,AF无定义,都使CF=0F=0

1.AND 与指令

格式:AND dst,src

操作:dst <— dst ^ SRC

 AND指令可以将两个操作数的内容按位相“与”,并将结果保存在目标操作数中。

AND指令常用于将操作数的某些位清0,而其余位维持不变。

2.OR 或指令

格式:OR dst,src

操作:dst <— dst V src

OR指令可将两个操作数的内容按位相“或”,并将结果保存在目标操作数中。

利用OR指令可将操作数的某些位置1,而其余位不变。

3.NOT 非指令

格式:NOT opr

操作:opr <— ~opr  ; 符号~表示逻辑反

NOT指令可将操作数的内容按位求反,并将结果保存在源操作数中,其执行结果不影响任何标志位

4.XOR 异或指令(相同为0,不同为1

格式:XOR dst,src

操作:dst <— dst (+) src

  XOR指令可将两个操作数按位“异或”,并将结果保存在目标操作数中。

  利用XOR指令,可将操作数的某些位求反,某些位不变。维持不变的位与0相“异或”,需要求反的位于1相“异或”。

5.TEST 测试指令

格式:TEST opr1,opr2

操作:opr1 ^ opr2

  TEST指令不回送到结果到目标操作数,只影响标志寄存器。功能和AND指令一样

  使用TEST指令,通常是在不希望改变原有操作数的情况下,检测某一位或某几位的状态。所以常被用于条件转移指令之前,根据测试的结果使程序发生跳转。

 

二、移位指令(当移位次数大于等于2时,要把移位次数放入CL中)

无论左移还是右移,移出的位一律进CF位。影响SF、ZF、PF

不允许使用立即数(大于等于2)和段寄存器

1.SHLshift  left):逻辑左移指令   左移一位相当于*2

格式:SHL dst,1/CL

操作:SHL指令可将操作数的内容向左移位,移位的次数由1或者CL给定,每左移一位,操作数最高位的状态移入CF标志位,低位补0

2.SHRshift right):逻辑右移指令 右移一位相当于/2

格式:SHR dst,1/CL

操作:SHR指令的操作和SHL指令相反,可将操作数的内容向右移位,每右移一位,操作数最末位移入CF标志,高位补0。

3.SALshift arithmetic left):算术左移指令

格式:SAL dst,1/CL

操作:与SHL指令完全相同(这两个指令用那个也可以)

4.SARshift airthmetic  right):算术右移指令

格式:SAR dst,1/CL

操作:将操作数的内容向右移位,每右移一位,操作数最末位移入CF标志位,最高位移入次高位的同时其值不变符号位始终保持不变

总结:

(1)算术左移(SAL)与逻辑左移(SHL)相同,可用于无符号数*2操作

         逻辑左移(SHL)可用于无符号数除2操作 

         算术右移(SAR)可以用于有符号数除2操作

(2)每左移一位,相当于将原来数据乘以2,每右移一位,相当于将原数据除2,根据移位操作的结果置状态标志器中的状态标志(AF(辅助进位)位除外),若移位的次数是1,移位的结果又使符号位发生改变,则将溢出标志OF1,若移多位时,OF标志无效,这样,对于有符号数而言,可由此判断移位后的符号位和移位前的符号位是否相同。

(3)移动一位时由指令中的计数值直接给出,移动两位及以上,则移位次数由CL指定,即必须将移位位数事先装入CL中。

三、循环移位指令

仅影响CF和OF标志位

1.ROL 循环左移指令

格式:ROL dst,count

操作:每左移一位,操作数最高位移出送入状态位CF和循环传递到操作数最末位

2.ROR 循环右移指令

格式:ROR dst,count

操作:ROR指令的操作和ROL指令相反,每右移一位,将操作数最末位移出,传递到CF标志和操作数的最高位

3.RCL 带进位循环左移指令

格式:RCL dst,count

操作:每左移一位,将操作数最高位移入CF标志位CF标志原先的状态移入操作数最末尾

4.RCR 带进位循环右移指令

格式:RCR dst,count

操作:RCR指令完成的操作和RCL指令正好相反,每右移一位,操作数最末位移入CF标志CF标志原先的状态移入操作数最高位

总结:

(1)循环移位也有两类,ROL和ROR指令在执行时,没有把CF套在循环中,常称为小循环移位。而RCL和RCR指令在执行时,连同CF一起进行循环移位,称为大循环移位。

(2)四条循环移位指令仅影响标志位CFOF,对OF的影响是:ROL和RCL指令在执行一次左移后,如果操作数的最高位与CF(原先的符号位)不等,说明新的符号位与原来的符号位不同了,则使OF=1,表明左移循环操作造成了溢出。同样,ROR和RCR指令在执行一次右移后,如果操作数的最高位和此高位不等,也表明移位后新的数据符号与原来的符号不同了,此时也会使OF = 1,产生溢出。

  • 8
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码头整点儿薯条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值