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