在汇编中,CMP和JMP指令常常用于比较操作,而且查看反汇编源码时也发现不管是.IF伪指令还是其他的底层都是用CMP实现的。
指令格式:
CMP 目的操作数,源操作数
计算机在遇到CMP指令的时候,CPU将目的操作数和源操作数做减法(即目的操作数-源操作数)从而根据运算结果修改标志位(如OF, CF , ZF, SF等)的值,然后接下来用相应的跳转指令来进行选择执行哪一段代码
另外,操作数有无符号是个头疼的事情,CPU并不能确定它运算的是有符号的减法还是无符号的减法,所以CPU会产生两套标志位。
由于我学的不是很深,下面只是简单的讨论一下CMP指令执行后标志位的结果(有错误请指出)
ZF: 置零标志位,当结果为0的时候ZF被赋值1
SF:负数标志位,当结果是负数的时候被赋值1
CF:进位/借位标志位,当最高位向它的上一位有借位或者进位的时候被赋值1
OF:溢出标志位,当有益处时(即运算结果超过了它的类型(如BYTE, WORD, DWORD)所能表示的范围)被赋值1
溢出的说明:两个正数相加,两个负数相加,正数减负数,负数减正数 都有可能溢出
正数溢出变负数,负数溢出变正数
1:无符号数的比较
目的操作数 < 源操作数 ZF=0