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
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 两条汇编指令, 创建函数栈框架 ....
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
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 两条汇编指令, 创建函数栈框架 ....
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