注册 登录
编程论坛 汇编论坛

这是编译器的事情,还是反汇编器的事情

wp231957 发布于 2014-07-04 09:19, 2242 次点击
源代码

程序代码:
#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)  这是为什么呢
5 回复
#2
zklhp2014-07-04 10:12
以下是引用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)  这是为什么呢

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

为啥编译型语言快呢 一方面是原生代码 一方面是编译优化
#3
wp2319572014-07-04 10:15
了解了 谢谢
#4
Explorerlxz2014-07-04 10:17
push 400h是把k作为printf函数的一个参数入栈!想要查看调用的函数,单步跟进那个函数就可以了吧,不能光看反汇编的结果,这就是动态调试嘛!F7还是,F8忘了
#5
wp2319572014-07-04 10:26
我支持z版的观点  根本就是把我的自定义函数给弄没了   和动态跟踪没啥关系
#6
wp2319572014-07-04 10:29
取消编译优化  看到了完整的代码

程序代码:

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


1