汇编语言AND指令实现对两个操作数进行逻辑(按位)与操作
AND指令在两个操作数的对应位之间进行(按位)逻辑与(AND)操作,并将结果存放在目标操作数中:
ANDdestination,source
下列是被允许的操作数组合,但是立即操作数不能超过32位:
ANDreg,reg
ANDreg,mem
ANDreg,imm
ANDmem,reg
ANDmem,imm
操作数可以是8位、16位、32位和64位,但是两个操作数必须是同样大小。两个操作数的每一对对应位都遵循如下操作原则:如果两个位都是1,则结果位等于1;否则结果位等于0。
下表展示了两个输入位X和Y,第三列是表达式X^Y的值:
X
Y
X^Y
0
0
0
0
1
0
1
0
0
1
1
1
AND指令可以清除一个操作数中的1个位或多个位,同时又不影响其他位。这个技术就称为位屏蔽,就像在粉刷房子时,用遮盖胶带把不用粉刷的地方(如窗户)盖起来。
例如,假设要将一个控制字节从AL寄存器复制到硬件设备。并且当控制字节的位0和位3等于0时,该设备复位。那么,如果想要在不修改AL其他位的条件下,复位设备,可以用下面的指令:
andAL,11110110b ;清除位0和位3,其他位不变
如,设AL初始化为二进制数10101110,将其与11110110进行AND操作后,AL等于10100110:
moval,10101110b
andal,11110110b ;AL中的结果=10100110
标志位
AND指令总是清除溢出和进位标志位,并根据目标操作数的值来修改符号标志位、零标志位和奇偶标志位。比如,下面指令的结果存放在EAX寄存器,假设其值为0。在这种情况下,零标志位就会置1:
andeax,1Fh
将字符转换为大写
AND指令提供了一种简单的方法将字符从小写转换为大写。如果对比大写A和小写a的ASCII码,就会发现只有位5不同:
0 1 1 0 0 0 0 1=61h('a')
0 1 0 0 0 0 0 1=41h('A')
其他的字母字符也是同样的关系。把任何一个字符与二进制数11011111进行AND,则除位5外的所有位都保持不变,而位5清0。下例中,数组中所有字符都转换为大写:
.data arrayBYTE50DUP(?) .code movecx,LENGTHOFarray movesi,OFFSET
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。