汇编语言----条件处理

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

    描述: 对每个操作数进行位与计算,结果保存在目的操作数中。

    例子:

          有如下的代码:

               G`MN`~PPSFSZJHRJ9KA}4]L

          我们调试一下:

                       34U()OA[@TWW@WO2%O7NI80

2.2 or

    影响: 总是清除CF OF, 修改ZF, PF

    描述: 对每个操作数进行位或计算,结果保存在目的操作数中。

    例子: 常用 or al, al 来判断al 是不是问0

ZF SF al的值
0 0 >0
1 0 =0
0 1 <0

             

             $VHQYQ_ZS4QNTV8)4)WNA[F

    @}K9Y2D0(0QV~S9CONX8{OB)6D[@L6NZ12F7{6811~I6@1

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值

LMMXZ291ENLLZLD$(P]H{R0

3.4 条件结构

1 if ( op1 == op2)
2
3 ……
4
5 else
6
7 ……

对应的汇编

1 mov eax, op1
2
3 cmp eax, ope2
4
5 je L1
1 if (a1 > b1) && (b1 > c1)
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:
1 if (a1 > b1) || b1 > c1
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:
1 while (val1 < val2)
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

你可能感兴趣的:(汇编语言)