• 汇编语言条件处理


    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
  • 相关阅读:
    mac 系统下删除目录的所有.svn文件
    java DES加密解密文件
    也许,未来需要重新规划
    android选择图片或拍照图片上传到服务器(包括上传参数)
    iOS DES ECB模式对称加密解密
    iOS开发中防止键盘挡住UITextField解决方案
    xCode 4.X 免证书真机公布及调试
    iOS 获取手机的型号,系统版本,软件名称,软件版本
    java DES ECB模式对称加密解密
    解决error: failed to launch"/private/var/mobile/Applications/XX" timed out waiting for app to launch
  • 原文地址:https://www.cnblogs.com/sld666666/p/2033637.html
Copyright © 2020-2023  润新知