共计 1140 个字符,预计需要花费 3 分钟才能阅读完成。
CF // 第 0 位, Carry Flag 进位标志位(如果运算结果的最高位产生了一个进位或者借位,CF 为 1, 否则, CF 位 0)
// 无符号运算的时候, 应该关注 CF(非常重要)
PF // 第 2 位, Parity Flag 奇偶标志位(运算结果中二进制 1 的个数的奇偶, 如果 1 的个数为偶数, 则 PF 为 1)AF // 第 4 位, Auxiliary Carry Flag 辅助进位标志位(发生以下情况时, AF 为 1)
1. 在字操作时, 发生低字节向高字节进位或者借位时
2. 在字节操作时, 发生低 4 位向高 4 位进位或借位时
ZF // 第 6 位, Zero Flag 零标志位(运算结果为 0, ZF 为 1, 否则, ZF 为 0)SF // 第 7 位, Sign Flag 符号标志位(用来反映运算结果的符号位, 与结果的最高位相同)OF // 第 11 位, Overflow Flag 溢出标致位(反映有符号数加减运算所得结果是否溢出, 如果溢出,OF 为 1)
// 有符号运算的时候, 应该关注 OF(非常重要)
// 正 + 正 = 负 // 如果两个正数相加, 结果为负数, 则溢出, OF = 1
// 负 + 负 = 正 // 如果两个负数相加, 结果为正数, 则溢出, OF = 1
// 正 + 负 // 永远不会溢出
DF // 第 10 位, Direction Flag(操作 ESI,EDI 是递增还是递减)
// 决定 movs, stos, cmps, scas, lods… 这种指令时, ESI 和 EDI 的增长方向
//DF = 1, 递减
//DF = 0, 递增
如果是无符号数运算, 是否溢出看 CF 位如果是有符号数运算, 是否溢出看 OF 位
ADC 指令 // 带进位加法(两边不能同时为内存, 宽度要一样)SBB 指令 // 带借位减法(两边不能同时为内存, 宽度要一样)XCHG 指令 // 交换数据(两边不能同时为内存, 宽度要一样)MOVS 指令 // 移动数据,ESI => EDI, 两边都为内存
byte/word/dword
movs byte ptr es:[edi], byte ptr ds:[esi] // 简写为 movsb
movs word ptr es:[edi], word ptr ds:[esi] // 简写为 movsw
movs dword ptr es:[edi], dword ptr ds:[esi] // 简写为 movsd
STOS 指令 // 将 AL/AX/EAX 的值存储到 [EDI] 指定的内存单元
stos byte ptr es:[edi] // 简写为 stosb
stos word ptr es:[edi] // 简写为 stosw
stos dword ptr es:[edi] // 简写为 stosd
REP 指令 // 按计数寄存器 (ECX) 中指定的次数重复执行字符串指令
mov ecx, 10h
rep movsd
rep stosd
以下指令不会影响两个操作数, 但会影响标志位 cmp 指令 // 比较两个操作数, 相当于 sub 指令, 结果不保存 test 指令 // 两个操作数进行与操作, 结果不保存