汇编 eax test jnz jz 等组合连用的总结

结论

这几个组合在一起通常是判断 函数返回结果是否是0.是0跳转到哪里,不是0跳转到哪里

举例分析

下面代码:就是判断2个字符串是否相等.

push edx
push eax
call dword ptr dS:[K&KERNEL32.1strcmpA>   //判断edx和 eax 2个字符串是否相等,调用的是C语言的 strcmp 
test eax,eax
push 0
JnZ Short Crackhe. 00401 0E8

上面代码call的是C语言的 strcmp ,这个函数比较2个字符串是否相等,如果相等,返回0,否则返回1, 返回的参数存入到eax里面.
然后如果用高级语言,想实现判断返回值是否等于0,如下

if (eax == 0){
	跳转到一个地方
}else{
    跳转到一个地方
}

在汇编中这么做判断eax是否等于0

test  eax,eax

test作用

test作用是逻辑与,逻辑与就是2个数字相同是1,否则是0.按位逻辑与,就是每一位二进制进行逻辑与
例如 :如果是 0111和 0001按位逻辑与结果是0001,因为只有最后一位全是1,其他都是0
eax如果是二进制数 0101的话, 0101按位逻辑与还等于0101.
例如 test eax, eax 就是 让eax 和 自己逻辑与,按位逻辑与的话,eax和eax是相同的,所以,只有eax是0的时候才会是0,否则 结果就是eax本身.
但是test的作用,并不会改变后面的寄存器eax,改变的是标志位.

ZF PF标志位改变不需要记,因为不方便记忆.

这里改变了ZF标志,变成了0,
PF标志,这里不进行讲解,因为记忆标志位不方便理解.想要知道具体的可以自己查询.
需要联合记忆.

我们需要记住是test下面语句的跳转语句意思

jnz

例如jnz,那么就是说不等于0的时候跳转n是not不,z是zero零.jnz检验的标志位就是zf,这个标志位通过test改变了zf,然后jnz进行跳转.当test比较的结果不等于0,就跳转

jz

test比较结果等于0才跳转.
例如 test eax,eax. 当eax等于0的时候. 0 按位逻辑与0的结果还是0, 那么 下面执行jz的时候就直接跳转了

总结

call 函数改变了eax
test eax,eax,判断eax是否等于0
jnz 判断如果不等于0跳转,相当于是用if else 判断是否等于0

下面截图是一段汇编指令,判断2个字符串是否相等的

在这里插入图片描述

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值