汇编-and逻辑与
and的逻辑运算符 &&
AND 指令在两个操作数的对应位之间进行(按位)逻辑与(AND)操作,并将结果存放在目标操作数中:
下列是被允许的操作数组合,但是立即操作数不能超过 32 位:
AND reg, reg
AND reg, mem
AND reg, imm
AND mem, reg
AND mem, imm
操作数可以是 8 位、16 位、32 位和 64 位,但是两个操作数必须是同样大小。两个操作数的每一对对应位都遵循如下操作原则:如果两个位都是 1,则结果位等于 1;否则结果位等于 0
AND指令常用于将操作数的某些位清0,而其余位维持不变
该技术称为位屏蔽
.386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data .code main PROC mov al,10110101b ;把低2位清零 and al,11111011b ;需要清零的位放0,保持不变的位放1 ;10110001 INVOKE ExitProcess,0 main ENDP END main
标志位
标志AND指令总是清零溢出标志和进位标志, 并根据目的操作数的值来修改符号标志、零标志和奇偶标志。
将小写字符转换为大写
AND指令提供了一种简单的方法将字符从小写转换为大写。比较大写A和小写a的ASCII码, 显然只有位5不同:
A=01000001b=65=0x41
a=01100001b=97=0x61
将任何一个字符与二进制数11011111进行AND, 则除位5外的所有位都保持不变, 而位5清零
.386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .data .code main PROC mov al,61h ;a=01100001b=97=0x61 mov dh, 10 ;第 10 行 mov dl, 20 ;第 20 列 call Gotoxy ;定位光标 call WriteChar ;显示字符 and al,11011111b ;将小写字符转换为大写 mov dh, 12 ;第 12 行 call Gotoxy ;定位光标 call WriteChar ;显示字符 INVOKE ExitProcess,0 main ENDP END main