详解汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令
汇编语言是依赖于计算机的低级的程序设计语言。
RCL(带进位循环左移)指令把每一位都向左移,进位标志位复制到LSB,而MSB复制到进位标志位:
如果把进位标志位当作操作数最高位的附加位,那么RCL就成了循环左移操作。下面的例子中,CLC指令清除进位标志位。第一条RCL指令将BL最高位移入进位标志位,其他位都向左移一位。第二条RCL指令将进位标志位移入最低位,其他位都向左移一位:
clc ;CF=0
movbl,88h ;CF,BL=01000100Ob
rclbl,1 ;CF,BL=100010000b
rclb1,1 ;CF,BL=000100001b
从进位标志位恢复位
RCL可以恢复之前移入进位标志位的位。下面的例子把testval的最低位移入进位标志位,并对其进行检查。如果testval的最低位为1,则程序跳转;如果最低位为0,则用RCL将该数恢复为初始值:
.data
testvalBYTE01101010b
.code
shrtestval,1 ;将lsb移入进位标志位
jcexit ;如果该标志位置1,则退出
rcltestval,1 ;否则恢复该数原值
RCR指令
RCR(带进位循环右移)指令把每一位都向右移,进位标志位复制到MSB,而LSB复制到进位标志位:
从上图来看,RCL指令将该整数转化成了一个9位值,进位标志位位于LSB的右边。下面的示例代码用STC将进位标志位置1,然后,对AH寄存器执行一次带进位循环右移操作:
stc ;CF=1
movah,10h ;AH,CF=000100001
rcrah,1 ;AH,CF=100010000
有符号数溢出
如果有符号数循环移动一位生成的结果超过了目的操作数的有符号数范围,则溢出标志位置1。换句话说,即该数的符号位取反。下例中,8位寄存器中的正数(+127)循环左移后变为负数(-2):
moval,+127 ;AL=01111111b
rolal,1 ;OF=1,AL=11111110b
同样,-128向右移动一位,溢出标志位置1。AL中的结果(+64)符号位与原数相反:
moval,-128 ;AL=10000000b
shral,1 ;OF=1,AL=01000000b
如果循环移动次数大于1,则溢出标志位无定义。
总结
以上所述是小编给大家介绍的汇编语言RCL(带进位循环左移)和RCR(带进位循环右移)指令,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。