关于编译器翻译出来的汇编语言的问题

时间:2021-07-01 01:29:00
#include <iostream>
using namespace std;
int f(int a,int b){
int c=a+b;
return c;
}

void main(){
int x=1;
int y=2;
int z;
z=f(x,y);
}

我的c++程序是上面所示的,在vc6.0下翻译成的汇编语言如下:
8:    void main(){
00401070   push        ebp
00401071   mov         ebp,esp
00401073   sub         esp,4Ch
00401076   push        ebx
00401077   push        esi
00401078   push        edi
00401079   lea         edi,[ebp-4Ch]
0040107C   mov         ecx,13h
00401081   mov         eax,0CCCCCCCCh
00401086   rep stos    dword ptr [edi]
9:        int x=1;
00401088   mov         dword ptr [ebp-4],1
10:       int y=2;
0040108F   mov         dword ptr [ebp-8],2
11:       int z;
12:       z=f(x,y);
00401096   mov         eax,dword ptr [ebp-8]
00401099   push        eax
0040109A   mov         ecx,dword ptr [ebp-4]
0040109D   push        ecx
0040109E   call        @ILT+0(f) (00401005)
004010A3   add         esp,8                            ;为什么要加上8
004010A6   mov         dword ptr [ebp-0Ch],eax          ;eax里面就是函数的返回值,为什么
                                                        ;要放在这个地方,ebp-0Ch表示哪
                                                        ;个位置?
13:   }
004010A9   pop         edi
004010AA   pop         esi
004010AB   pop         ebx
004010AC   add         esp,4Ch
004010AF   cmp         ebp,esp
004010B1   call        __chkesp (004081a0)
004010B6   mov         esp,ebp
004010B8   pop         ebp
004010B9   ret



3:    int f(int a,int b){
00401030   push        ebp
00401031   mov         ebp,esp
00401033   sub         esp,44h                  ;为什么要在这个地方减去44h
00401036   push        ebx
00401037   push        esi
00401038   push        edi
00401039   lea         edi,[ebp-44h]            ;这条语句的作用是什么?
0040103C   mov         ecx,11h                  ;ecx不是用来控制循环次数的吗,在这里面
                                                ;没有循环,把它赋值有什么目的?
00401041   mov         eax,0CCCCCCCCh           ;把eax赋值为0CCCCCCCCh有什么目的?
00401046   rep stos    dword ptr [edi]          ;这句话是干什么用的?
4:        int c=a+b;
00401048   mov         eax,dword ptr [ebp+8]    ;ptr表示什么?这个语句是给eax赋了什么值
0040104B   add         eax,dword ptr [ebp+0Ch] ;dword ptr [ebp+0Ch]好像是b或者a的值,
                                                ;为什么要在ebp上加上0Ch
0040104E   mov         dword ptr [ebp-4],eax
5:        return c;
00401051   mov         eax,dword ptr [ebp-4]   ;ebp就是原来的esp,这里为什么要把结果放
                                               ;放在这个地方?
6:    }
00401054   pop         edi
00401055   pop         esi
00401056   pop         ebx
00401057   mov         esp,ebp                ;这里是恢复call之前的堆栈指针吗?
00401059   pop         ebp
0040105A   ret

6 个解决方案

#1


只是Debug版本的汇编代码, 没必要深入研究, 只需要了解大概就可以了.

#2


不解。。
up

#3


老大, 你既然想看汇编, 至少你得了解点汇编得基本概念吧, 不会连 edx : eax 什么的存放返回值 , ebp 为栈框架指针, [ebp+xx] 是访问参数 , [ebp-xx] 是访问局部变量 , esi , edi 被用作寄存器变量什么的都不知道吧. 


004010A3   add         esp,8   ;为什么要加上8 , C 调用约定要求调用者清理堆栈, f 有两个参数共8字节, 加8字节就是为了调整堆栈.

00401033   sub         esp,44h  ;为什么要在这个地方减去44h , 为局部变量保留空间, debug 版会多分配 0x40 字节的局部变量空间. 

00401039   lea         edi,[ebp-44h]            ;这条语句的作用是什么?
0040103C   mov         ecx,11h                  ;ecx不是用来控制循环次数的吗,在这里面
                                                ;没有循环,把它赋值有什么目的?
00401041   mov         eax,0CCCCCCCCh           ;把eax赋值为0CCCCCCCCh有什么目的?
00401046   rep stos    dword ptr [edi]          ;这句话是干什么用的?
-------------------------------------------------------------------------------
这几句意思就是 memset( ebp - 0x44 , 0xcc , 0x44 ) , 0xcc 对应于指令 int 3 , debug 版会将所有的局部变量初始化为 0xcc , 如果你程序不小心跑飞了(缓冲区溢出), 就有机会中断程序执行, 如果溢出的代码是你精心构造的, 这就是缓冲区溢出攻击鸟. 


[ebp+8] [ebp+0ch] 见上, 是访问函数参数.

00401057   mov         esp,ebp                ;这里是恢复call之前的堆栈指针吗?
00401059   pop         ebp

和上面的 : 

00401030   push        ebp
00401031   mov         ebp,esp

就是分别对应 level , enter 两条汇编指令, 创建函数栈框架 ....

#4


不深究他 ...

#5


这样研究那行啊,看看汇编基本教程吧,我现在也在看呢。。。

#6


考C++区讨论起ASM了啊??只有深入研究效率的程序才要看ASM

#1


只是Debug版本的汇编代码, 没必要深入研究, 只需要了解大概就可以了.

#2


不解。。
up

#3


老大, 你既然想看汇编, 至少你得了解点汇编得基本概念吧, 不会连 edx : eax 什么的存放返回值 , ebp 为栈框架指针, [ebp+xx] 是访问参数 , [ebp-xx] 是访问局部变量 , esi , edi 被用作寄存器变量什么的都不知道吧. 


004010A3   add         esp,8   ;为什么要加上8 , C 调用约定要求调用者清理堆栈, f 有两个参数共8字节, 加8字节就是为了调整堆栈.

00401033   sub         esp,44h  ;为什么要在这个地方减去44h , 为局部变量保留空间, debug 版会多分配 0x40 字节的局部变量空间. 

00401039   lea         edi,[ebp-44h]            ;这条语句的作用是什么?
0040103C   mov         ecx,11h                  ;ecx不是用来控制循环次数的吗,在这里面
                                                ;没有循环,把它赋值有什么目的?
00401041   mov         eax,0CCCCCCCCh           ;把eax赋值为0CCCCCCCCh有什么目的?
00401046   rep stos    dword ptr [edi]          ;这句话是干什么用的?
-------------------------------------------------------------------------------
这几句意思就是 memset( ebp - 0x44 , 0xcc , 0x44 ) , 0xcc 对应于指令 int 3 , debug 版会将所有的局部变量初始化为 0xcc , 如果你程序不小心跑飞了(缓冲区溢出), 就有机会中断程序执行, 如果溢出的代码是你精心构造的, 这就是缓冲区溢出攻击鸟. 


[ebp+8] [ebp+0ch] 见上, 是访问函数参数.

00401057   mov         esp,ebp                ;这里是恢复call之前的堆栈指针吗?
00401059   pop         ebp

和上面的 : 

00401030   push        ebp
00401031   mov         ebp,esp

就是分别对应 level , enter 两条汇编指令, 创建函数栈框架 ....

#4


不深究他 ...

#5


这样研究那行啊,看看汇编基本教程吧,我现在也在看呢。。。

#6


考C++区讨论起ASM了啊??只有深入研究效率的程序才要看ASM