1. CPU状态标志 状态标志位是汇编 条件 处理 的基石。 CF(carry flag) 进位标志 PF(parith flag) 奇偶标志 AF(auxiliary carry flag) 赋助进位标志 ZF(Zero flag) 零标志 SF(sign flag) 符号标志(有符号,无符号) OF(overlow flag) 溢出标志 2. 布尔和比
1. CPU状态标志
状态标志位是汇编条件处理的基石。
CF(carry flag) | 进位标志 |
PF(parith flag) | 奇偶标志 |
AF(auxiliary carry flag) | 赋助进位标志 |
ZF(Zero flag) | 零标志 |
SF(sign flag) | 符号标志(有符号,无符号) |
OF(overlow flag) | 溢出标志 |
2. 布尔和比较指令
2.1 and
影响: 总是清除CF OF, 修改ZF, PF
描述: 对每个操作数进行位与计算,结果保存在目的操作数中。
例子:
有如下的代码:
我们调试一下:
2.2 or
影响: 总是清除CF OF, 修改ZF, PF
描述: 对每个操作数进行位或计算,结果保存在目的操作数中。
例子: 常用 or al, al 来判断al 是不是问0
ZF | SF | al的值 |
0 | 0 | >0 |
1 | 0 | =0 |
0 | 1 | <0 |
,
2.3 xor
影响: 总是清除CF OF, 修改ZF, PF
描述: 对每个操作数进行位异或计算,结果保存在目的操作数中。
2.4 not
影响:不影响任何标志位
描述: 安位取反
2.5 test
执行隐含的 and 操作。 和and的唯一区别是不影响目的操作数。
2.6 cmp
影响: 修改ZF, PF AG, SF, OF
描述: 对每个操作数隐含的减法运算,不影响目的操作数。
cmp的结果 | 标志 |
目的<源 | SF != OF |
目的>源 | SF = OF |
目的 = 源 | ZF = 1 |
3. 条件跳转
3.1 基于CPU标志位的跳转
JZ | ZF =1 则跳 |
JNZ | ZF != 1 |
JC | CF =1 |
JNC | CF ! =1 |
JO | OF =1 |
JNO | OF != 1 |
JS | SF =1 |
JNS | SF != 1 |
JP | PF = 1 |
JNP | PF != 1 |
3.2 比较
3.2.1 相等比较
JE | 相等则跳 |
jne | 不相等则跳 |
JCXZ | CX = 0则跳 |
JECXZ | ECX = 0 则跳 |
3.2.2 无符号比较
JA | 大于则跳 |
JNBE | 不小于或等于则跳(= ja) |
jae | 大于或等于则跳 |
jnb | 不小于则跳 |
jb | 小于则跳 |
jnae | 不大于或等于则跳 |
jbe | 小于或等于则跳 |
jna | 大于则跳 |
3.2.3 有符号比较
JG | 大于则跳 |
HNLE | 不小于或等于则跳 |
JGB | 大于或等于则跳 |
JNL | 不小于则跳 |
JL | 小于则跳 |
JNGE | 不大于或等于则跳 |
JLE | 小于或等于则跳 |
JNG | 大于则跳 |
3.3 列子
下面的例子是查找16位数组的第一个非0值
3.4 条件结构
1 if ( op1 == op2)
2
3 ……
4
5 else
6
7 ……
2
3 ……
4
5 else
6
7 ……
对应的汇编
1 mov eax, op1
2
3 cmp eax, ope2
4
5 je L1
2
3 cmp eax, ope2
4
5 je L1
1 if (a1 > b1) && (b1 > c1)
2
3 x =1
2
3 x =1
对应的汇编结构
1 cmp a1, b1
2
3 ja L1
4
5 jmp next
6
7 L1:
8
9 cmp b1, c1
10
11 ja L2
12
13 jmp next
14
15 L2;
16
17 mov x, 1
18
19 next:
2
3 ja L1
4
5 jmp next
6
7 L1:
8
9 cmp b1, c1
10
11 ja L2
12
13 jmp next
14
15 L2;
16
17 mov x, 1
18
19 next:
1 if (a1 > b1) || b1>c1
2
3 x=1
2
3 x=1
对应的汇编结构:
1 cmp al,b1
2
3 ja L1
4
5 cmp b1, c1
6
7 jbe next
8
9 L1 mov x,1
10
11 next:
2
3 ja L1
4
5 cmp b1, c1
6
7 jbe next
8
9 L1 mov x,1
10
11 next:
1 while (val1 < val2)
2
3 {
4
5 val1++;
6
7 val2--;
8
9 }
2
3 {
4
5 val1++;
6
7 val2--;
8
9 }
对应的汇编结构:
1 mov eax, val1
2
3 while:
4
5 cmp eax, val2
6
7 jnl endWhile
8
9 jnc eax
10
11 dec val2
12
13 jmp while
14
15 endWhile:
16
17 mov val1, eax
2
3 while:
4
5 cmp eax, val2
6
7 jnl endWhile
8
9 jnc eax
10
11 dec val2
12
13 jmp while
14
15 endWhile:
16
17 mov val1, eax