freshbug's notes

freshbug的代码人生

用户操作
[即时聊天] [发私信] [加为好友]
freshbugID:bekilledlzy
15567次访问,排名7606好友0人,关注者0
bekilledlzy的文章
原创 17 篇
翻译 0 篇
转载 32 篇
评论 6 篇
freshbug的公告
访问www.freshbug.com
自2007年10月16日
freshbug的联系方式:
freshbug@gmail.com
最近评论
loadend:你好,我想问一下,那注册google ad帐户的时候不是要填网址嘛,填什么呢?是不是填http://blog.csdn.net/用户名/??
freshbug:stl里面有一些静态变量 不能跨dll vector有时候能跨dll是因为连续的内存分布

跨模块传输数据最好是能用C风格的结构 用C++类很容易出问题
wang:我是向dll中传一个map指针,结果也是it++之后就内存泄漏
wang:我也遇到了类似问题。
远离尘嚣:老大,能把你的Uft8ToAnsi是自定义的转码函数共享一下嘛?万分感谢!
文章分类
收藏
    相册
    who's freshbug?
    技术站点
    老牛们的blog
    咨讯
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载 test和cmp一个很菜很基础的话题收藏

    新一篇: 汇编语言命令速查 | 旧一篇: VC快捷键大全

     

    标 题:test和cmp一个很菜很基础的话题!  
    发信人: FTBirthday
    时 间:2003/05/19 01:14am
    详细信息:

    看过破解教程,都知道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.

    结论很简单嘛,之前我怎么就分不清呢,真是笨哪!

    发表于 @ 2007年08月30日 10:40:00|评论(loading...)|编辑

    新一篇: 汇编语言命令速查 | 旧一篇: VC快捷键大全

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © freshbug