飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 7802|回复: 25

[转贴] test和cmp的比较.....

[复制链接]

该用户从未签到

发表于 2009-4-16 11:39:47 | 显示全部楼层 |阅读模式
看过破解教程,都知道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逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。EST 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.
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2009-4-16 11:47:36 | 显示全部楼层
总结的不错 所以转过来分享下

我对 test 和 cmp 的理解是这样的 这两个指令都不修改操作数 只做一个运算后修改 标志寄存器

test 是对两个操作数 做 and 运算  结果为0 则置 ZF 为 1
cmp  是对两个操作数 做 sub 运算  结果为0 则置 ZF 为 1  
(ZF的意思就是是0吗? ZF=1 是的 1表示真 表示 0 )

而下边一般都跟 jne je 的指令 这两个指令和cmp联合后 我们可以理解为 是否相等
je  相等则跳  ZF 为 1
jne 不等则跳  ZF 为 0

test 一般都是检测寄存器之类的 无关大雅

几个运算指令:
xor 相同为0 不同为1  
or  是有1则1  
and 是有0则0
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2018-10-30 22:05
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2009-4-16 12:01:19 | 显示全部楼层
    学习。。。。。。。。。。。。。。。。。。。。。。。。。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-4-16 12:13:19 | 显示全部楼层
    记号...
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-4-25 19:39
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2009-4-16 15:36:55 | 显示全部楼层
    还是 2楼的简单明了!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-4-16 22:32:26 | 显示全部楼层
    还是看nisy的还比较明哈
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-4-16 23:07:06 | 显示全部楼层
    test 是对两个操作数 做 and 运算  结果为0 则置 ZF 为 1
    cmp  是对两个操作数 做 sub 运算  结果为0 则置 ZF 为 1  
    (ZF的意思就是是0吗? ZF=1 表示 0 )


    这个非常清楚,原来对test也是不太明白,现在学习了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-4-17 09:00:17 | 显示全部楼层
    学习。。。。。/:014
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-4-17 12:52:50 | 显示全部楼层
    不错的总结……
    汇编学习中……
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-4-17 15:12:30 | 显示全部楼层
    谢谢~小弟又长见识了
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表