免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
工具下载:
链接: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后面跟着的是什么跳转指令
![]()