欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 14.x86游戏实战-汇编指令cmp test

14.x86游戏实战-汇编指令cmp test

2024/11/30 10:36:16 来源:https://blog.csdn.net/qq_36301061/article/details/140279112  浏览:    关键词:14.x86游戏实战-汇编指令cmp test

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:13.x86游戏实战-汇编指令neg shr shl sar

test、cmp一般用来作比较

test它与and的功能一样,也就是一个与运算,但是它不会改变操作数(test eax, 2,这里的eax位置就是操作数)的内容,test会改变eflags寄存器的内容

cmp与sub的功能一样,也就是一个减运算,它也不会改变操作数的内容(不会把结果放到操作数里),它也只会改变eflags寄存器的内容

eflags寄存器

它是标志寄存器,理论上它里面每一位都代表了一个东西(为什么说理论上,因为eflags寄存器有一些位目前是没有任何意义没有任何用的),如下图efalgs寄存器用到的每一位所代表的东西,记不住没关系,后面用到了会有非常详细保姆级的说明,现在完全不需要记不需要理解,现在只要知道有这么回事就行

跳转指令:跳不跳转取决于eflags寄存器里的值

JE   ;等于则跳转
JNE  ;不等于则跳转JZ   ;为 0 则跳转
JNZ  ;不为 0 则跳转JS   ;为负则跳转
JNS  ;不为负则跳转JC   ;进位则跳转
JNC  ;不进位则跳转JO   ;溢出则跳转
JNO  ;不溢出则跳转JA   ;无符号大于则跳转
JNA  ;无符号不大于则跳转
JAE  ;无符号大于等于则跳转
JNAE ;无符号不大于等于则跳转JG   ;有符号大于则跳转
JNG  ;有符号不大于则跳转
JGE  ;有符号大于等于则跳转
JNGE ;有符号不大于等于则跳转JB   ;无符号小于则跳转
JNB  ;无符号不小于则跳转
JBE  ;无符号小于等于则跳转
JNBE ;无符号不小于等于则跳转JL   ;有符号小于则跳转
JNL  ;有符号不小于则跳转
JLE  ;有符号小于等于则跳转
JNLE ;有符号不小于等于则跳转JP   ;奇偶位置位则跳转
JNP  ;奇偶位清除则跳转
JPE  ;奇偶位相等则跳转
JPO  ;奇偶位不等则跳转

test指令

一般与跳转指令一起使用,就是用来做判断,如果比如1大于2就跳转到某某函数、某某地址,test会改变eflags寄存器的值,这并没有什么用,有用的是跳转指令,跳转指令会根据eflags寄存器的值来决定跳不跳转

test指令一般会如下图中的例子来使用,一般跟在调用完函数的下一句,用来判断函数返回值是不是0,如果是0一般说明返回值有问题(具体要根据实际情况分析,后面遇到了会详细写),然后如下图eax的值是1,然后test是一个与操作,所以eflags寄存器不会是0,所以jnz会跳转

执行结果

不跳转的例子,也就是与完的结果是0

cmp

上方说test一般用来判断返回值是否存在(返回值是否是0),cmp就是用来做大小比较的,如下图eax的值是0,ecx的值是2,eax比ecx小

然后执行jle指令就会跳转,所以至于是做大于判断还是小于判断,取决于cmp后面跟着的是什么跳转指令


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com