| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2242 人关注过本帖
标题:这是编译器的事情,还是反汇编器的事情
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:20 回复次数:5 
这是编译器的事情,还是反汇编器的事情
源代码

程序代码:
#include <stdio.h>

int power(int m,int n);

int main(void)
{   int k=power(4,5); 
    printf("%d",k);
    return 0;
}

int power(int m,int n)
{
    int s=1;
    for(;n>0;s*=m,n--);
    return s;
}


od反汇编后的代码

程序代码:
00401000 >/$ 68 00040000    PUSH 400                                 ; /<%d> = 400 (1024.)
00401005  |. 68 F4204000    PUSH OFFSET w5.??_C@_02DPKJAMEF@?$CFd?$A>; |format = "%d"
0040100A  |. FF15 A0204000  CALL DWORD PTR DS:[<&MSVCR100.printf>]   ; \printf
00401010  |. 83C4 08        ADD ESP,8
00401013  |. 33C0           XOR EAX,EAX
00401015  \. C3             RETN



我还想看一下 int k=power(4,5); 这个函数的反汇编代码  可是 它却直接给我翻译成了立即数 (push 400h)  这是为什么呢
搜索更多相关主题的帖子: include 源代码 编译器 
2014-07-04 09:19
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:20 
以下是引用wp231957在2014-7-4 09:19:56的发言:

源代码
 
#include  
 
int power(int m,int n);
 
int main(void)
{   int k=power(4,5);  
    printf("%d",k);
    return 0;
}
 
int power(int m,int n)
{
    int s=1;
    for(;n>0;s*=m,n--);
    return s;
}
 
od反汇编后的代码
 
00401000 >/$ 68 00040000    PUSH 400                                 ; /<%d> = 400 (1024.)
00401005  |. 68 F4204000    PUSH OFFSET w5.??_C@_02DPKJAMEF@?$CFd?$A>; |format = "%d"
0040100A  |. FF15 A0204000  CALL DWORD PTR DS:[<&MSVCR100.printf>]   ; \printf
00401010  |. 83C4 08        ADD ESP,8
00401013  |. 33C0           XOR EAX,EAX
00401015  \. C3             RETN
 
 
 
我还想看一下 int k=power(4,5); 这个函数的反汇编代码  可是 它却直接给我翻译成了立即数 (push 400h)  这是为什么呢

编译优化 如果不开优化可能就老老实实编译了

为啥编译型语言快呢 一方面是原生代码 一方面是编译优化
2014-07-04 10:12
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
了解了 谢谢

DO IT YOURSELF !
2014-07-04 10:15
Explorerlxz
Rank: 9Rank: 9Rank: 9
来 自:zzu
等 级:蜘蛛侠
威 望:4
帖 子:302
专家分:1032
注 册:2013-4-24
收藏
得分:0 
push 400h是把k作为printf函数的一个参数入栈!想要查看调用的函数,单步跟进那个函数就可以了吧,不能光看反汇编的结果,这就是动态调试嘛!F7还是,F8忘了
2014-07-04 10:17
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
我支持z版的观点  根本就是把我的自定义函数给弄没了   和动态跟踪没啥关系

DO IT YOURSELF !
2014-07-04 10:26
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
取消编译优化  看到了完整的代码

程序代码:
00401000 >/$ 55             PUSH EBP
00401001  |. 8BEC           MOV EBP,ESP
00401003  |. 51             PUSH ECX
00401004  |. 6A 05          PUSH 5                                   ; /Arg2 = 00000005
00401006  |. 6A 04          PUSH 4                                   ; |Arg1 = 00000004
00401008  |. E8 23000000    CALL w5.power                            ; \power
0040100D  |. 83C4 08        ADD ESP,8
00401010  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
00401013  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00401016 >|. 50             PUSH EAX                                 ; /<%d>
00401017  |. 68 EC204000    PUSH OFFSET w5.GS_ExceptionPointers      ; |format = "%d"
0040101C  |. FF15 A0204000  CALL DWORD PTR DS:[<&MSVCR100.printf>]   ; \printf
00401022  |. 83C4 08        ADD ESP,8
00401025 >|. 33C0           XOR EAX,EAX
00401027  |. 8BE5           MOV ESP,EBP
00401029  |. 5D             POP EBP
0040102A  \. C3             RETN
0040102B     CC             INT3
0040102C     CC             INT3
0040102D     CC             INT3
0040102E     CC             INT3
0040102F     CC             INT3
00401030 >/$ 55             PUSH EBP
00401031  |. 8BEC           MOV EBP,ESP
00401033  |. 51             PUSH ECX
00401034  |. C745 FC 010000>MOV DWORD PTR SS:[EBP-4],1
0040103B  |. EB 13          JMP SHORT w5.00401050
0040103D  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
00401040  |. 0FAF45 08      |IMUL EAX,DWORD PTR SS:[EBP+8]
00401044  |. 8945 FC        |MOV DWORD PTR SS:[EBP-4],EAX
00401047  |. 8B4D 0C        |MOV ECX,DWORD PTR SS:[EBP+C]
0040104A  |. 83E9 01        |SUB ECX,1
0040104D  |. 894D 0C        |MOV DWORD PTR SS:[EBP+C],ECX
00401050  |> 837D 0C 00      CMP DWORD PTR SS:[EBP+C],0
00401054  |. 7E 02          |JLE SHORT w5.00401058
00401056  |.^EB E5          \JMP SHORT w5.0040103D
00401058  |> 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0040105B  |. 8BE5           MOV ESP,EBP
0040105D  |. 5D             POP EBP
0040105E  \. C3             RETN



DO IT YOURSELF !
2014-07-04 10:29
快速回复:这是编译器的事情,还是反汇编器的事情
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019019 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved