关系运算符

关系运算符的运算结果只有0和1

关系运算符含义
==等于(a==b)
!=不等于(a!=b)
>=大于等于(a>=b)
<=小于等于(a<=b)
>大于(a>b)
<小于(a<b)

set指令:

功能: 若条件(标志位的值)成立,则字节寄存器reg8或字节存储器单元被设置为1,否则被设置为0.条件见下表:

指令含义标志位
SETBE/SETNA小于等于/不大于CF=1 或 ZF=1
SETE/SETZ等于/为零ZF=1
SETNE/SETNZ不等于/不为零ZF=0
SETG/SETNLE大于/不小于等于(有符号)SF=0 且 ZF=0
SETGE/SETNL大于等于/不小于(有符号)SF=0
SETL/SETNGE小于/不大于等于(有符号)SF=1
SETLE/SETNG小于等于/不大于(有符号)SF=1 或 ZF=1
SETC有进位或借位CF=1
SETNC无进位或借位CF=0
SETO有溢出OF=1
SETNO无溢出OF=0
SETP/SETPE低8位1的个数为偶数PF=1
SETNP/SETPO低8位1的个数为奇数PF=0
SETS结果为负SF=1
SETNS结果为正SF=0

其中在CE中SETNC指令相当于SETNE,一般都会把SETNE写成SETNC。
例如:
CMP EAX,EBX
SETNC CL //如果EAX不=EBX,那么CL=01,否则CL=00
CMP EAX,ECX
SETE [20401000] //如果EAX=ECX,那么0x20401000处=01,否则=00
注意目标为地址时,不需要用 XXXX PTR 来区分数据的操作长度。

同样在修改时,如果不知道前面判定的结果会是什么,那么可以直接把
SETE AL改成MOV AL,01或者是MOV AL,00这两种指令,来看游戏中的实际影响。
SETE AL指令占3字节,MOV AL,01指令占2字节,再补上一个NOP指令,正好可以替换


关系运算符汇编代码:

//"=="运算符
void Function()
{
	int a = 10;
	int b = 20;
	int c = a==b;

	//汇编代码为:
	//mov         dword ptr [ebp-4],0Ah			int a = 10;
	//mov         dword ptr [ebp-8],14h			int b = 20;
	//mov         eax,dword ptr [ebp-4]			将a的值10放入eax中
	//xor         ecx,ecx						ecx置零
	//cmp         eax,dword ptr [ebp-8]			a减去b不保存结果,只影响标志位
	//sete        cl							如果zf=1则将cl的值设置为1,这里zf=0,所以ecx的值还是0
	//mov         dword ptr [ebp-0Ch],ecx		将ecx的值给变量C,这里ecx=0,所以C=0;

}
//"!="运算符
void Function()
{
	int a = 10;
	int b = 20;
	int c = a!=b;

	//汇编代码为:
	//mov         dword ptr [ebp-4],0Ah			
	//mov         dword ptr [ebp-8],14h			
	//mov         eax,dword ptr [ebp-4]			
	//xor         ecx,ecx						
	//cmp         eax,dword ptr [ebp-8]			
	//setne        cl							如果zf=0则将cl设置为1.这里zf=0,ecx=1
	//mov         dword ptr [ebp-0Ch],ecx		ecx=1,c=ecx,c=1;

}
//">"运算符
void Function()
{
	int a = 1;
	int b = 2;
	int c = a > b;
	
	//汇编代码:
	//mov         dword ptr [ebp-4],1
	//mov         dword ptr [ebp-8],2
	//mov         eax,dword ptr [ebp-4]
	//xor         ecx,ecx
	//cmp         eax,dword ptr [ebp-8]
	//setg        cl						如果sf=0且zf=0,则cl设置为1,这里sf=1,ecx=0
	//mov         dword ptr [ebp-0Ch],ecx   c  = 0
}

//"<"运算符
void Function()
{
	int a = 1;
	int b = 2;
	int c = a < b;
	
	//汇编代码:
	//mov         dword ptr [ebp-4],1
	//mov         dword ptr [ebp-8],2
	//mov         eax,dword ptr [ebp-4]
	//xor         ecx,ecx
	//cmp         eax,dword ptr [ebp-8]
	//setl        cl						如果sf=1,则cl设置为1,这里sf=1,ecx=1
	//mov         dword ptr [ebp-0Ch],ecx   c  = 1
}

//">="运算符
void Function()
{
	int a = 1;
	int b = 2;
	int c = a >= b;
	
	//汇编代码:
	//mov         dword ptr [ebp-4],1
	//mov         dword ptr [ebp-8],2
	//mov         eax,dword ptr [ebp-4]
	//xor         ecx,ecx
	//cmp         eax,dword ptr [ebp-8]
	//setge		  cl						如果sf=0,则cl设置为1,这里sf=1,ecx=0
	//mov         dword ptr [ebp-0Ch],ecx   c=0
}
//"<="运算符
void Function()
{
	int a = 1;
	int b = 2;
	int c = a <= b;
	
	//汇编代码:
	//mov         dword ptr [ebp-4],1
	//mov         dword ptr [ebp-8],2
	//mov         eax,dword ptr [ebp-4]
	//xor         ecx,ecx
	//cmp         eax,dword ptr [ebp-8]
	//setle		  cl						如果sf=1或zf=1,则cl设置为1,这里sf=1,ecx=1
	//mov         dword ptr [ebp-0Ch],ecx   c=1
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值