32位汇编:实验6位运算类指令使用

实验(1)
逻辑运算知识总结
1.1 基本逻辑运算类型
| 运算 | 符号 | 含义 | 规则 | 汇编语法 | 标志位影响 |
|---|---|---|---|---|---|
| 与 | AND | 两个位都为1时结果为1 | 1 AND 1 = 1,其他情况为0 | AND dest, src | CF=0, OF=0, SF/ZF/PF根据结果设置 |
| 或 | OR | 两个位中有一个为1时结果为1 | 0 OR 0 = 0,其他情况为1 | OR dest, src | CF=0, OF=0, SF/ZF/PF根据结果设置 |
| 非 | NOT | 位取反 | NOT 1 = 0,NOT 0 = 1 | NOT dest | 不影响任何标志位 |
| 异或 | XOR | 两个位不同时结果为1 | 1 XOR 0 = 1,0 XOR 1 = 1,其他情况为0 | XOR dest, src | CF=0, OF=0, SF/ZF/PF根据结果设置 |
1.2 逻辑运算在计算机中的应用
- 位掩码操作
- 提取特定位:
AND value, mask - 设置特定位:
OR value, mask - 清除特定位:
AND value, NOT mask - 翻转特定位:
XOR value, mask
- 提取特定位:
- 条件判断和标志位设置
- 测试特定位:
TEST value, mask(相当于AND但不保存结果) - 判断奇偶:
AND value, 1或TEST value, 1 - 清零寄存器:
XOR reg, reg
- 测试特定位:
- 数据加密和校验
- 简单加密:
XOR data, key - 校验和计算:多数据XOR
- 哈希算法:位混合操作
- 简单加密:
- 硬件控制
- 设备寄存器位操作
- 状态标志读取和设置
1.3 标志位影响
- AND运算常用于清除特定位(掩码清零)
- OR运算常用于设置特定位(掩码置1)
- XOR运算常用于翻转特定位或实现无临时变量的交换
- NOT运算常用于位反转或求补码
| 运算 | CF | OF | SF | ZF | PF | AF |
|---|---|---|---|---|---|---|
| AND | 清零(0) | 清零(0) | 根据结果设置 | 根据结果设置 | 根据结果设置 | 未定义 |
| OR | 清零(0) | 清零(0) | 根据结果设置 | 根据结果设置 | 根据结果设置 | 未定义 |
| XOR | 清零(0) | 清零(0) | 根据结果设置 | 根据结果设置 | 根据结果设置 | 未定义 |
| NOT | 不影响 | 不影响 | 不影响 | 不影响 | 不影响 | 不影响 |
实验示例
我们经手算得到varT1 与 varT2 结果一致,说明通过与或非实现了异或运算
varT1 = 11111101_01000100_01100000_10101100
varT2 = 11111101_01000100_01100000_10101100
我们验证以下
varT1 = FD4460AC
varT2 = FD4460AC

经验证与手算结果一致。
实验(2)
移位运算知识点总结
2.1 移位运算分类
| 运算 | 符号 | 含义 | 规则 | 汇编语法 | 标志位影响 |
|---|---|---|---|---|---|
| 逻辑左移 | SHL | 所有位向左移动,低位补0 | 相当于乘以2ⁿ | SHL dest, count | CF=最后移出的位,OF仅在count=1时有意义 |
| 逻辑右移 | SHR | 所有位向右移动,高位补0 | 无符号数除以2ⁿ | SHR dest, count | CF=最后移出的位,OF仅在count=1时有意义 |
| 算术右移 | SAR | 所有位向右移动,高位符号位扩展 | 有符号数除以2ⁿ | SAR dest, count | CF=最后移出的位,OF=0 |
| 循环左移 | ROL | 所有位向左移动,高位循环到低位 | 位循环移动 | ROL dest, count | CF=最后移出的位 |
| 循环右移 | ROR | 所有位向右移动,低位循环到高位 | 位循环移动 | ROR dest, count | CF=最后移出的位 |
| 带进位循环左移 | RCL | 包含进位标志的循环左移 | 包含CF标志位 | RCL dest, count | CF=最后移出的位 |
| 带进位循环右移 | RCR | 包含进位标志的循环右移 | 包含CF标志位 | RCR dest, count | CF=最后移出的位 |
移位计数说明:
- count可以是立即数(1-31)或CL寄存器内容
- 对于8086,count=1时可直接用立即数,count>1时必须用CL
2.2 移位运算在计算机中的应用
- 快速乘除法优化
- 乘以2ⁿ:
SHL value, n - 除以2ⁿ:
SHR value, n(无符号)或SAR value, n(有符号) - 乘以常数:如×10 = ×8 + ×2 =
(value<<3) + (value<<1)
- 乘以2ⁿ:
- 数据打包和解包
- 位字段提取:
SHR+AND - 位字段设置:先清除再
OR - 数据压缩:多个小数值打包到更大数据类型
- 位字段提取:
- BCD码处理
- ASCII转BCD:
AND 0Fh去除ASCII高位 - 压缩BCD:两个BCD数字合并到一个字节
- ASCII转BCD:
- 算法实现
- 循环冗余校验(CRC):移位和XOR组合
- 加密算法:位置换操作
- 浮点数处理:阶码调整
2.3 标志位影响
- 左移(SHL)相当于乘以2的幂次,但可能溢出
- 右移(SHR/SAR)相当于除以2的幂次,算术右移保持符号位
- 循环移位(ROL/ROR)不改变数值大小,仅改变位的位置
① 非循环移位运算
| 运算 | CF | OF | SF | ZF | PF | AF |
|---|---|---|---|---|---|---|
| SHL | 最后移出的位 | 仅count=1时有意义* | 根据结果设置 | 根据结果设置 | 根据结果设置 | 未定义 |
| SHR | 最后移出的位 | 仅count=1时有意义* | 根据结果设置 | 根据结果设置 | 根据结果设置 | 未定义 |
| SAR | 最后移出的位 | 清零(0) | 根据结果设置 | 根据结果设置 | 根据结果设置 | 未定义 |
- OF在count=1时的含义:
- SHL:若结果的最高位与CF不同,则OF=1(表示符号改变)
- SHR:设置为操作数原来的最高位
② 循环移位运算
| 运算 | CF | OF | SF | ZF | PF | AF |
|---|---|---|---|---|---|---|
| ROL | 最后移出的位 | 仅count=1时有意义* | 不影响 | 不影响 | 不影响 | 不影响 |
| ROR | 最后移出的位 | 仅count=1时有意义* | 不影响 | 不影响 | 不影响 | 不影响 |
| RCL | 最后移出的位 | 仅count=1时有意义* | 不影响 | 不影响 | 不影响 | 不影响 |
| RCR | 最后移出的位 | 仅count=1时有意义* | 不影响 | 不影响 | 不影响 | 不影响 |
- OF在count=1时的含义:
- ROL:若结果的最高位与CF不同,则OF=1
- ROR:若结果的最高位与次高位不同,则OF=1
- RCL:若结果的最高位与CF不同,则OF=1
- RCR:若结果的最高位与次高位不同,则OF=1
实验示例
(1)无符号数乘以10的两种方法
经分析发现代码实现功能为:用“左移+加法”完成无符号数乘 10,避免乘法指令,是嵌入式/汇编里常用的“移位代替乘法”技巧。
34000 × 10 = 34000 × (2 + 8) = 34000×2 + 34000×8
我们对比发现

前面移位运算与imul eax,10效果一致
(2)位操作应用
第一部分:多倍精度移位
mov ecx,4; 循环4次
again:
shr dword ptr qvar+4,1; 先移动高32位
rcr dword ptr qvar,1; 后移动低32位(带进位)
loop again
功能: 将64位数 1234567887654321h 逻辑右移4位
移位过程:
- 使用SHR处理高32位
- 使用RCR处理低32位(接收来自高位的进位)
- 循环4次完成右移4位操作

第一次循环结束后再重复步骤,总循环四次后
ecx归0,跳出循环完成移位运算
ASCII转压缩BCD码
字符 '3' = 33h → 取低4位 → 03h
字符 '8' = 38h → 取低4位 → 08h → 左移4位 → 80h
组合:03h OR 80h = 83h (压缩BCD码表示38)

转换结果与期待结果一致。
