查看: 472|回复: 5

[原创图文] 汇编中的test和cmp指令

[复制链接]

4

主题

17

帖子

0

精华

初级会员

Rank: 4

学币
16
荣耀
0
rank
0
违规
0

    发表于 2020-3-21 20:51:09 | 显示全部楼层 |阅读模式
    看过破解教程,都知道test,cmp是比较关键,可是我一直不清楚它们究竟是怎么比较的,最后下决心找了很多资料,和大家一起把它们弄清楚.
    首先看看:状态寄存器(即标志寄存器)
    PSW(Program Flag)程序状态字(即标志)寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,
    如下所示:
    15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0
            OF DF IF TF SF ZF   AF   PF   CF
    条件码:
    ①OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配.
    ②SF(Sign Flag)符号标志,结果为负时置1,否则置0.
    ③ZF(Zero Flag)零标志,运算结果为0时置1,否则置0.
    ④CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位.
    ⑤AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。
        有进位时1,否则置0.
    ⑥PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0.
    控制标志位:
    ⑦DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
    ⑧IF(Interrupt Flag)中断标志。
    ⑨TF(Trap Flag)陷井标志。
    为举例方便说一下jnz和jz
        测试条件
    JZ   ZF=1
    JNZ  ZF=0
    即Jz=jump if zero (结果为0则设置ZF零标志为1,跳转)
    Jnz=jump if not zero
    好,接着来看test和cmp
    *******************************************************************************
    test属于逻辑运算指令
    功能: 执行BIT与BIT之间的逻辑运算
         测试(两操作数作与运算,仅修改标志位,不回送结果).
    Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。TEST AX,BX 与 AND AX,BX 命令有相同效果
    语法: TEST r/m,r/m/data
    影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0)
    运用举例:
    1.Test用来测试一个位,例如寄存器:
    test eax, 100b;          b后缀意为二进制
    jnz  ******;             如果eax右数第三个位为1,jnz将会跳转
    我是这样想的,jnz跳转的条件是ZF=0,ZF=0意味着ZF(零标志)没被置位,即逻辑与结果为1.
    2.Test的一个非常普遍的用法是用来测试一方寄存器是否为空:
    test ecx, ecx
    jz somewhere
    如果ecx为零,设置ZF零标志为1,Jz跳转
    *******************************************************************************
    CMP属于算术运算指令
    功能: 比较两个值(寄存器,内存,直接数值)
    语法: CMP r/m,r/m/data
    标志位: C,P,A,Z,O
    CMP比较.(两操作数作减法,仅修改标志位,不回送结果).
    cmp实际上是只设置标志不保存结构的减法,并设置Z-flag(零标志).
    零标志很像carry,也是内部标志寄存器的一位.
    例如:
    Cmp eax, 2;       如果eax-2=0即eax=2就设置零标志为1
    Jz ****;          如果设置了零标志就跳转
    *******************************************************************************
    我得出的结论
    test逻辑与运算结果为零,就把ZF(零标志)置1;
    cmp 算术减法运算结果为零,就把ZF(零标志)置1.

    评分

    参与人数 3学币 +3 收起 理由
    xuenixiang + 1 总结的很到位
    Lily + 1
    White + 1 感谢您的热心解答,学到了!

    查看全部评分

    温馨提示:
    1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
    2.回复帖子不仅是对作者的最好奖励,还可以获得学币奖励,请尊重作者的劳动成果,拒绝做伸手党!
    3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。

    0

    主题

    143

    帖子

    0

    精华

    中级会员

    Rank: 8Rank: 8

    学币
    369
    荣耀
    0
    rank
    0
    违规
    0

      发表于 2020-3-22 17:30:05 | 显示全部楼层
      啥也不说了,楼主就是给力!

      6

      主题

      33

      帖子

      0

      精华

      版主

      Rank: 32Rank: 32

      学币
      140
      荣耀
      0
      rank
      0
      违规
      0

        发表于 2020-3-23 18:51:28 | 显示全部楼层
        cmp指令格式:   cmp   操作对象A, 操作对象B

        就是: 计算 操作对象A - 操作对象B 但不保存结果,只是根据结果修改相应的标志位

        test指令不会改变值   ,只会改变ZF标志位的值.

        0

        主题

        6

        帖子

        0

        精华

        初级会员

        Rank: 4

        学币
        69
        荣耀
        0
        rank
        0
        违规
        0

          发表于 2020-3-24 13:20:42 | 显示全部楼层
          学习了,谢谢

          1

          主题

          63

          帖子

          0

          精华

          VIP

          Rank: 16

          学币
          163
          荣耀
          1
          rank
          0
          违规
          0

            发表于 2020-3-26 16:47:19 | 显示全部楼层
            用心讨论,共获提升!

            2

            主题

            15

            帖子

            0

            精华

            VIP

            Rank: 16

            学币
            21
            荣耀
            0
            rank
            0
            违规
            0

            VIP

              发表于 2020-3-28 07:34:15 来自手机 | 显示全部楼层
              兄弟 一起研究 学习逆向有一段时间了 可否发个联系方式 加个好友
              快速回复 返回顶部 返回列表