汇编语言----条件处理
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

![G`MN`~PPSFSZJHRJ9KA}4]L G`MN`~PPSFSZJHRJ9KA}4]L](https://images.cnblogs.com/cnblogs_com/sld666666/201104/201104302308221957.jpg)




![LMMXZ291ENLLZLD$(P]H{R0 LMMXZ291ENLLZLD$(P]H{R0](https://images.cnblogs.com/cnblogs_com/sld666666/201104/201104302310408617.jpg)
浙公网安备 33010602011771号