首页
社区
课程
招聘
[旧帖] [求助]条件判断语句反汇编的困惑 0.00雪花
发表于: 2009-9-19 22:22 5900

[旧帖] [求助]条件判断语句反汇编的困惑 0.00雪花

2009-9-19 22:22
5900
书上说:汇编层中的条件判断与高级语言中是相反的,比如
if(i==0)
{
i=1;
}
.....
程序源代码中是测试变量i是否等于0,而编译器把条件置反了,生出的汇编语句中判断的是变量i是否不等于0,书上给的原因是:编译器生成的汇编代码是根据程序在源码中的结构来组织其在内存中的汇编代码的结构的。
对于书上给的这个原因我看不懂,希望高手们提点一二,本人新学菜鸟

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 201
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
呵呵,楼主真是善于思考
2009-9-19 22:24
0
雪    币: 5
活跃值: (421)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
汗,贴子发了一整天了没高手出现帮本鸟解惑,本鸟今天细想了一下,觉得应该是这样(别拿鸡蛋扔我)
在高级语言中的一段代码:
if(a==0)
{
...处理
}
...否则跳出if语句执行的后面代码

而书上说,编译器是根据程序在高级语言源代码中的结构来组织汇编语言的结构的,也就是说汇编语言的结构应该和程序相一致.那么必须是这样:
cmp eax,0  //if(a==0)
.....条件跳转指令 //这里的指令就是我们要讨论的地方,按照高级语言的判断是等于零的话则执行后面的语句,按照高级语言的要求这里就该这么写"jz 地址(等于0)",那么后面的地址写哪呢?写if语句里的地址的话,当不等于0时也会执行if语句里的代码,这显然不正确,写if后面的话就更不正确了,就相当于"等于0则跳转"与程序南辕北辙了,所以说这里不能按照程序里的写jz(等于0)而应该写jnz(不等于0),这样写程序的结果和高级语言的预期结果就吻合了,而判断条件则和高级语言的"等于0"是相反的,这就验证了书上的说法:汇编层中的条件与源代码中的条件是相反的
{
......if语句中的代码
}

呵呵纯属菜鸟看法,高手莫偷笑
2009-9-20 22:42
0
雪    币: 5
活跃值: (421)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
其实书上说的意思很简单,指的仅仅是判断的那条语句,具体的结果不管它,当高级语言中是“==”时,反汇编出"!=",比如a==0和jnz,是我想得复杂了~
2009-9-21 13:28
0
雪    币: 55
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
只有一个if的情况下,这是很显然的,if后面的花括弧里仅仅是一个程序段,所以是不满足条件则跳转,这样比设置成“满足条件跳转”节省代码,流程也好。
如果if else的话,情况就比较复杂,因为有两个选择分支,这时候具体是怎么判断条件我也不清楚。

顺便,编译器很少用cmp eax,0的,都是or eax,eax,节省代码。
2009-9-21 16:24
0
游客
登录 | 注册 方可回帖
返回
//