[转载]test后跟je

今天俺也用OD(OllyDbg)反汇编了个小软件,其中里面有下面两条指令:

 

没太明白什么意思,google一下,在看雪论坛上发现了一个大虾的解释很详细,记录一下:

1.test a,b 是a与b相与的意思,不是检查a,b是否相等。故test eax,eax是检查eax是否为零。
1.test可以影响cf,of,pf,sf,zf标志位。
2.JE当zf为零时跳转。
3.jz和je是同一条指令的两个不同记号而已。

补充:

1.test a,b是做 AND 运算(虽然通常是用来测试结果是否为零,但不限于此,比如一些位掩码操作,或者正负号判断等),但不把结果写回目的操作数,仅根据结果的值来置标志位。

2.je/jz 是 当运算结果为0时则跳,也就是当EFLAGS中的ZF标志为1时跳转。ZF标志为1,说明上一次运算(不管是算术运算还是逻辑运算)结果为0,而ZF为0,说明运算结果非0。

那 test eax,eax 放到这程序里面对于验证是否注册有什么意义呢?为什么要检测这个值是不是零呢? 

因为EAX中是前一步的计算结果(比如验证是否成功),要判断验证是否成功,当然就等于判断EAX中的值了。当然,理论上不一定要和0比较,也可以进行其它的判断,但在这种情况下通常是一种bool型的值,在C中没有bool这种类型,而是把0作为false,把任何非0值作为true,所以这里就要判断它是true还是false,也就是判断它是不是为零了。

 

http://hi.baidu.com/csummmfezadouyf/item/d03965d347043e4afb576898

posted on   iackjee  阅读(721)  评论(0编辑  收藏  举报

编辑推荐:
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
阅读排行:
· 盘点!HelloGitHub 年度热门开源项目
· DeepSeek V3 两周使用总结
· 02现代计算机视觉入门之:什么是视频
· C#使用yield关键字提升迭代性能与效率
· 2. 什么?你想跨数据库关联查询?

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示