zoukankan      html  css  js  c++  java
  • 汇编语言条件处理

    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
  • 相关阅读:
    《挑战程序设计竞赛》 读后感
    基于SOAP的xml网络交互心得
    不用客户端,轻松下视频
    在cmd窗口中查询android的sqlite3数据库表之步骤
    单链表的插入删除以及逆转
    java中排序一个字符串数组
    求质因数
    指针与引用的区别
    统计查询-sql
    ---随心买统计查询
  • 原文地址:https://www.cnblogs.com/sld666666/p/2033637.html
Copyright © 2011-2022 走看看