首页
社区
课程
招聘
反汇编一段很简单的代码,有几个问题不懂。
发表于: 2006-10-29 14:06 4078

反汇编一段很简单的代码,有几个问题不懂。

2006-10-29 14:06
4078
//test.cpp
float f()
{
        float f0=1.2f;
        return f0;
}

int i()
{
        int i0=12;
        return i0;
}

int main(int argc, char* argv[])
{
        int i0;
        float f0;
        i0=i();
        f0=f();
        int i1=i0;
        return 0;
}

//ida反汇编结果
...
.text:00401000 sub_401000      proc near               ; CODE XREF: sub_401020+5p
.text:00401000                 fld     ds:flt_4060A0
.text:00401006                 retn
.text:00401006 sub_401000      endp
.text:00401006
.text:00401006 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:00401007                 align 10h
.text:00401010
.text:00401010 ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
.text:00401010
.text:00401010
.text:00401010 sub_401010      proc near               ; CODE XREF: sub_401020p
.text:00401010                 mov     eax, 0Ch
.text:00401015                 retn
.text:00401015 sub_401010      endp
.text:00401015
.text:00401015 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
.text:00401016                 align 10h
.text:00401020
.text:00401020 ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
.text:00401020
.text:00401020
.text:00401020 sub_401020      proc near               ; CODE XREF: start+AFp
.text:00401020                 call    sub_401010
.text:00401025                 call    sub_401000
.text:0040102A                 fstp    st
.text:0040102C                 xor     eax, eax
.text:0040102E                 retn
.text:0040102E sub_401020      endp

...

本来我是想看函数是怎么返回float值的,结果发现了别的问题
为什么i0,f0,i1三个变局部变量没有出现在main函数的堆栈中,也没有对各个值赋值的代码
在vc6中release方式编译,ida4.8反汇编

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 257
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
被编译器优化掉了, 因为你那个几变量无用,如int i1=i0;
i1并没有在其他地方使用,所以被优化掉了
2006-10-29 14:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你只是在main里面声明了那两个变量,并没有定义,所以编译器不立即给它们分配空间。这不是代码优化的结果。注意C语言里声明和定义变量的区别。
2006-10-29 15:33
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 Jovzhao 发布
你只是在main里面声明了那两个变量,并没有定义,所以编译器不立即给它们分配空间。这不是代码优化的结果。注意C语言里声明和定义变量的区别。


int i;不就是定义吗?
能不能具体说说?谢谢。
2006-10-29 16:13
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 ViperDodge 发布
被编译器优化掉了, 因为你那个几变量无用,如int i1=i0;
i1并没有在其他地方使用,所以被优化掉了


的确是
加句printf就知道了
2006-10-29 17:27
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 jronald 发布
int i;不就是定义吗?
能不能具体说说?谢谢。

#include <stdio.h>
int main()
{
        int a = 10;
        int b;
        b = a;
        printf("%d,%d\n",a,b);
        return 0;
        }
//////////////////////////////////
        .text
;    1 #include <stdio.h>
;    2 int main()
        .type        _main,function
_main:
        pushl        %ebp
        movl        %esp,%ebp
        pushl        %ecx
        pushl        %eax
        movl        $2,%ecx//只有两个变量a,b
_$3:
        decl        %ecx
        movl        $0xfffa5a5a,(%esp,%ecx,4)
        jne        _$3
        pushl        %edi
;    3 {
        .line        3
;    4         int a = 10;
        .line        4
        movl        $10,-4(%ebp)//有内存
;    5         int b;//没有内存
;    6         b = a;
        .line        6
        movl        -4(%ebp),%edi//有内存
        movl        %edi,-8(%ebp)
;    7         printf("%d,%d\n",a,b);
        .line        7
        pushl        -8(%ebp)
        pushl        -4(%ebp)
        pushl        $_$2
        call        _printf
        addl        $12,%esp
;    8         return 0;
        .line        8
        movl        $0,%eax
_$1:
;    9         }
        .line        9
        popl        %edi
        leave
        ret
_$4:
        .size        _main,_$4-_main
        .globl        _main
        .extern        _printf
        .data
_$2:
; "%d,%d\n\x0"
        .byte        37,100,44,37,100,10,0
////////////////////////////////////////
具体参见<C/C++深层次探索>中关于声明和定义的讨论.
注意:当你声明一个变量后,你在下文用的时候编译器就会给它分配内存.
2006-10-30 22:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好像也不一定哦:)
即使是申明了变量,在下面又用到了变量,编译器还是有可能进行优化省略的,比如:

#include "stdio.h"
int main()
{
        int        i = 1;
        printf("%d\n", i);
           return 0;
}

; int __cdecl main(int argc,const char **argv,const char *envp)
_main proc near
push    1
push    offset s_D      ; "%d\n"
call    _printf
add     esp, 8
xor     eax, eax
retn
_main endp

因为整个程序里i只用了一次,i就直接被编译器优化为1了
这种源程序和汇编之间的转化优化完全取决与编译器,而且现在编译器的优化又做了不错,有时侯要完全还原为C源码不是很容易.
2006-10-31 06:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
6楼朋友说的那个<<C&C++深层次...>>书在哪里可以找到啊,能否给个连接?
谢谢
2006-10-31 07:01
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
最初由 Jovzhao 发布
#include <stdio.h>
int main()
{
int a = 10;
int b;
........


这种汇编看不太懂。
我想应该是优化的结果吧,那肯定不同的实现有不同的优化方法吧。
懒得管了。
2006-11-3 05:44
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
10
纠正一个错误;
int i=0;既是声明又是定义
int i声明;
i=0定义;
2006-11-3 05:55
0
游客
登录 | 注册 方可回帖
返回
//