6.3 逻辑、移位与循环移位指令
算术把寄存器看成一个数;逻辑指令则可以把它看成一排彼此独立的开关。这对硬件控制寄存器非常重要:其中一个位可能启动定时器,另一个位可能选择设备模式。
AND、OR、XOR、NOT 与 TEST
逻辑指令会在每个位位置独立应用真值表规则:
AND只有在两个输入位都是 1 时才产生 1。
OR在任一输入位为 1 时产生 1。
XOR在两个输入位不同时产生 1。
NOT翻转每一位,并且只有一个操作数。
TEST为设置标志而计算 AND 结果,但不保存该结果。
掩码(mask)是为了修改部分位置并保留其他位置而选择的位模式。不同运算的“保持值”不同:AND 使用掩码 1 保持原位,OR 与 XOR 使用掩码 0 保持原位。
正在绘制图表…
假设 AL=A5H,二进制为 10100101:
AND AL,0FH得到05H,清除高半字节。
OR AL,0FH得到AFH,设置低半字节。
XOR AL,0FH得到AAH,翻转低半字节。
AND、OR、XOR 和 TEST 会清除 CF 与 OF,再根据逻辑结果设置 SF、ZF 与 PF;AF 变为未定义。NOT 不修改任何标志。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
移位会移动位,循环移位会让位返回
移位(shift)把所有位向左或向右移动。最后一个离开目的的位会复制到 CF。
SHL(也称SAL)向左移,在位 0 插入 0;若没有重要位丢失,它可以把无符号值乘以 2。
SHR向右移,在最高位插入 0。它相当于无符号除以 2,余数位保存在 CF。
SAR向右移,同时重复原符号位。它保持二进制补码值的符号;负奇数会向负无穷方向舍入。
循环移位(rotate)把移出的位送回另一端,因此保留寄存器内全部位。ROL 与 ROR 只在寄存器内部循环;RCL 与 RCR 把 CF 当作额外的第九位或第十七位。
正在绘制图表…
原始 8086 的可变移位次数来自 CL;指令也可以直接移动一位。次数大于一时,相当于重复单步移位。CF 保存最后一个移出的位。OF 在单步移位或循环时有定义,但对更大次数不应依赖。
比较 F0H 的两种右移:
SHR F0H,1插入 0,得到78H,即无符号 120。
SAR F0H,1重复符号位,得到F8H,即有符号 −8。
两条指令都会把旧最低位送入 CF,但它们回答的是不同数值问题。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
逻辑与移位可以准备数据,但程序还必须选择下一条执行哪条指令。第 6.4 节将把标志与比较、分支和计数循环连接起来。