在学习汇编语言时,逻辑运算是绕不开的基础内容。它不像高级语言那样用 if、else 判断条件,而是直接操控二进制位,实现与、或、非、异或这些基本逻辑。理解这些操作,能帮你更清楚地看到计算机是如何“思考”的。
什么是逻辑运算
逻辑运算处理的是真假值,在汇编中表现为 0 和 1。常见的逻辑指令有 AND、OR、NOT、XOR,它们对寄存器或内存中的数据按位进行操作。比如,一个字节由8位组成,每一对对应的位独立进行逻辑计算。
AND 指令:用来清零某些位
AND 的规则是:只有两个位都为 1,结果才为 1。常用于屏蔽某些位。例如,你想把 AL 寄存器的低4位清零,可以这样写:
AND AL, 0F0h
假设 AL 原来是 5Bh(即二进制 01011011),执行后变成 01010000,低4位全被置0。这种技巧在提取高半字节数据时特别有用,比如处理键盘扫描码时过滤无效位。
OR 指令:设置特定的位
OR 是只要有1,结果就是1。它常用来强制打开某些位。比如要让 BL 的最低位置1,可以:
OR BL, 01h
不管原来最低位是0还是1,现在一定是1。这在配置硬件控制寄存器时很常见,比如开启某个中断允许位,又不想影响其他功能。
XOR 指令:翻转或清零
XOR 是异或,相同为0,不同为1。它的妙用之一是快速将寄存器清零:
XOR EAX, EAX
这条指令比 MOV EAX, 0 更快,因为不需要从内存取立即数。另外,XOR 还可用于位翻转。比如想把 CL 的第3位取反:
XOR CL, 08h
每次执行都会改变该位状态,像开关一样,适合做简单的状态切换。
NOT 指令:按位取反
NOT 是单操作数指令,把每一位0变1、1变0。例如:
NOT DL
如果 DL 原来是 3Ah(00111010),执行后变为 C5h(11000101)。这个操作在生成补码或反码时会用到,也常出现在加密或校验算法中。
实际应用场景
你可能觉得这些操作离日常开发很远,但其实它们藏在很多地方。比如嵌入式系统中读取传感器状态,往往需要通过 AND 提取有效位;图形程序中操作像素颜色通道,会用 OR 合并透明度;而防病毒软件扫描特征码时,XOR 常用于混淆检测模式。
再举个例子:老式游戏机的按键输入通常通过一个端口读取,每个按键对应一位。你想知道方向键是否被按下,就可以用 AND 配合掩码判断:
IN AL, 60h ; 读取键盘端口
AND AL, 0Fh ; 只保留低4位(假设方向键在这)
CMP AL, 0 ; 是否全为0?
如果不为0,说明至少有一个方向键被按下。这种精细到位的操作,正是汇编的魅力所在。