一、逻辑指令
除了NOT指令不对符号位有影响,AND、OR、XOR、TEST对符号标志为影响都一样,对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.SHL(shift left):逻辑左移指令 左移一位相当于*2
格式:SHL dst,1/CL
操作:SHL指令可将操作数的内容向左移位,移位的次数由1或者CL给定,每左移一位,操作数最高位的状态移入CF标志位,低位补0。
2.SHR(shift right):逻辑右移指令 右移一位相当于/2
格式:SHR dst,1/CL
操作:SHR指令的操作和SHL指令相反,可将操作数的内容向右移位,每右移一位,操作数最末位移入CF标志,高位补0。
3.SAL(shift arithmetic left):算术左移指令
格式:SAL dst,1/CL
操作:与SHL指令完全相同(这两个指令用那个也可以)
4.SAR(shift airthmetic right):算术右移指令
格式:SAR dst,1/CL
操作:将操作数的内容向右移位,每右移一位,操作数最末位移入CF标志位,最高位移入次高位的同时其值不变,符号位始终保持不变。
总结:
(1)算术左移(SAL)与逻辑左移(SHL)相同,可用于无符号数*2操作
逻辑左移(SHL)可用于无符号数除2操作
算术右移(SAR)可以用于有符号数除2操作
(2)每左移一位,相当于将原来数据乘以2,每右移一位,相当于将原数据除2,根据移位操作的结果置状态标志器中的状态标志(AF(辅助进位)位除外),若移位的次数是1,移位的结果又使符号位发生改变,则将溢出标志OF置1,若移多位时,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一起进行循环移位,称为大循环移位。文章来源:https://www.toymoban.com/news/detail-435745.html
(2)四条循环移位指令仅影响标志位CF和OF,对OF的影响是:ROL和RCL指令在执行一次左移后,如果操作数的最高位与CF(原先的符号位)不等,说明新的符号位与原来的符号位不同了,则使OF=1,表明左移循环操作造成了溢出。同样,ROR和RCR指令在执行一次右移后,如果操作数的最高位和此高位不等,也表明移位后新的数据符号与原来的符号不同了,此时也会使OF = 1,产生溢出。文章来源地址https://www.toymoban.com/news/detail-435745.html
到了这里,关于【微机原理】汇编指令之位操作指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!