cmp指令与标志寄存器

cmp指令用来比较两操作数大小,该指令会做第一操作数减第二操作数的操作,但并不会将相减结果存储,不会改变两操作数的数值.         例:  cmp ax,bx

额…那咋比大小?

这时候就要提到标志寄存器,因为cmp会对标志寄存器中的标志位进行操作;

cb8065380cd79123bf25e307ad345982b3b780ff

 

这里需要注意的就是ZF,SF,OF,CF

ZF:表明执行此操作结果是否为零

SF:与运算结果的最高位相同(在不溢出时可表示操作结果正负号)

OF:表示是否有溢出(当数据作为符号数时看此标志位)

CF:表示是否有进位或错位(当将数据作为负号数时看标志位)

所以我们可以从这四个标志位的状态判断cmp的比较结果:

有符号数:

相等:ZF==01

小于:SF==1&&OF==0||SF==0&&OF==1

大于:SF==0&&OF==0||SF==1&&OF==1

无符号数:

相等:ZF==1

小于:CF==1

大于:CF==0&&ZF==0

PS:    机器不会在意你的数据是否有符号,就是当数算…

debug中:

溢出标志OF(Over flow flag)                             OV(1)                         NV(0)

符号标志SF(Sign flag)                                  NG(1)                         PL(0)

零标志ZF(Zero flag)                                    ZR(1)                         NZ(0)

 

进位标志CF(Carry flag)                                 CY(1)                         NC(0)

花絮:

学习逆向时碰到了cmp与标志位,因为汇编之前就自己看了个开头所以有些迷糊,就开始查资料学习这个内容(哪里有错误请大神指出,话说大神也不会点进来看这个吧……)

用debug实践个标志位时,被OF和CF给搞晕了,后来翻书才发现是自己理解错了.

不懂围棋的我看了一下午的人机大战…李世石认输时那叫一个爽嗷嗷嗷.