实验(1)

逻辑运算知识总结

1.1 基本逻辑运算类型

运算符号含义规则汇编语法标志位影响
AND两个位都为1时结果为11 AND 1 = 1,其他情况为0AND dest, srcCF=0, OF=0, SF/ZF/PF根据结果设置
OR两个位中有一个为1时结果为10 OR 0 = 0,其他情况为1OR dest, srcCF=0, OF=0, SF/ZF/PF根据结果设置
NOT位取反NOT 1 = 0,NOT 0 = 1NOT dest不影响任何标志位
异或XOR两个位不同时结果为11 XOR 0 = 1,0 XOR 1 = 1,其他情况为0XOR dest, srcCF=0, OF=0, SF/ZF/PF根据结果设置

1.2 逻辑运算在计算机中的应用

  1. 位掩码操作
    • 提取特定位:AND value, mask
    • 设置特定位:OR value, mask
    • 清除特定位:AND value, NOT mask
    • 翻转特定位:XOR value, mask
  2. 条件判断和标志位设置
    • 测试特定位:TEST value, mask(相当于AND但不保存结果)
    • 判断奇偶:AND value, 1 或 TEST value, 1
    • 清零寄存器:XOR reg, reg
  3. 数据加密和校验
    • 简单加密:XOR data, key
    • 校验和计算:多数据XOR
    • 哈希算法:位混合操作
  4. 硬件控制
    • 设备寄存器位操作
    • 状态标志读取和设置

1.3 标志位影响

  • AND运算常用于清除特定位(掩码清零)
  • OR运算常用于设置特定位(掩码置1)
  • XOR运算常用于翻转特定位或实现无临时变量的交换
  • NOT运算常用于位反转或求补码
运算CFOFSFZFPFAF
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, countCF=最后移出的位,OF仅在count=1时有意义
逻辑右移SHR所有位向右移动,高位补0无符号数除以2ⁿSHR dest, countCF=最后移出的位,OF仅在count=1时有意义
算术右移SAR所有位向右移动,高位符号位扩展有符号数除以2ⁿSAR dest, countCF=最后移出的位,OF=0
循环左移ROL所有位向左移动,高位循环到低位位循环移动ROL dest, countCF=最后移出的位
循环右移ROR所有位向右移动,低位循环到高位位循环移动ROR dest, countCF=最后移出的位
带进位循环左移RCL包含进位标志的循环左移包含CF标志位RCL dest, countCF=最后移出的位
带进位循环右移RCR包含进位标志的循环右移包含CF标志位RCR dest, countCF=最后移出的位

移位计数说明

  • count可以是立即数(1-31)或CL寄存器内容
  • 对于8086,count=1时可直接用立即数,count>1时必须用CL

2.2 移位运算在计算机中的应用

  1. 快速乘除法优化
    • 乘以2ⁿ:SHL value, n
    • 除以2ⁿ:SHR value, n(无符号)或 SAR value, n(有符号)
    • 乘以常数:如×10 = ×8 + ×2 = (value<<3) + (value<<1)
  2. 数据打包和解包
    • 位字段提取:SHR + AND
    • 位字段设置:先清除再OR
    • 数据压缩:多个小数值打包到更大数据类型
  3. BCD码处理
    • ASCII转BCD:AND 0Fh去除ASCII高位
    • 压缩BCD:两个BCD数字合并到一个字节
  4. 算法实现
    • 循环冗余校验(CRC):移位和XOR组合
    • 加密算法:位置换操作
    • 浮点数处理:阶码调整

2.3 标志位影响

  • 左移(SHL)相当于乘以2的幂次,但可能溢出
  • 右移(SHR/SAR)相当于除以2的幂次,算术右移保持符号位
  • 循环移位(ROL/ROR)不改变数值大小,仅改变位的位置

① 非循环移位运算

运算CFOFSFZFPFAF
SHL最后移出的位仅count=1时有意义*根据结果设置根据结果设置根据结果设置未定义
SHR最后移出的位仅count=1时有意义*根据结果设置根据结果设置根据结果设置未定义
SAR最后移出的位清零(0)根据结果设置根据结果设置根据结果设置未定义
  • OF在count=1时的含义:
  • SHL:若结果的最高位与CF不同,则OF=1(表示符号改变)
  • SHR:设置为操作数原来的最高位

② 循环移位运算

运算CFOFSFZFPFAF
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)

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