|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1: #include <stdio.h>
2: int main(int argc,char* argv[]) ;参数的获取是ebp+12字节作为第二个参数,ebp+8为第一个参数,依次增加
;最后ebp+4字节处是要返回的地址
3: {
00401010 55 push ebp ;把基址ebp入栈
00401011 8B EC mov ebp,esp ;保存栈顶指针到ebp
00401013 83 EC 40 sub esp,40h ;ebp下移一个范围,等于在堆栈中放出一片新的空间用以保存变量
00401016 53 push ebx ;入栈三个寄存器
00401017 56 push esi
00401018 57 push edi
00401019 8D 7D C0 lea edi,[ebp-40h] ;把保存局部变量的区域(从ebp-40h开始的区域)初始化成全部0cccccccch
;occh实际是int 3指令的机器码,这是一个断点中断指令。因为局部变量不可能被执行
;如果执行了,必然程序有错,这时发生中断来提示开发者
0040101C B9 10 00 00 00 mov ecx,10h ;stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中,同时edi会增加4(字节数)。
00401021 B8 CC CC CC CC mov eax,0CCCCCCCCh ;rep使指令重复执行ecx中填写次数
00401026 F3 AB rep stos dword ptr [edi]
4: printf("Hello world!");
00401028 68 1C 20 42 00 push offset string "Hello world!" (0042201c) ;将字符串“Hello world”入栈
0040102D E8 2E 00 00 00 call printf (00401060) ;调用printf函数输出
00401032 83 C4 04 add esp,4 ;esp加4
5: }
00401035 5F pop edi ;回复edi、esi、ebx、esp、ebp,最后返回
00401036 5E pop esi
00401037 5B pop ebx
00401038 83 C4 40 add esp,40h
0040103B 3B EC cmp ebp,esp
0040103D E8 9E 00 00 00 call __chkesp (004010e0)
00401042 8B E5 mov esp,ebp ;回复原来的ebp和esp,让上一个调用的函数正常使用
00401044 5D pop ebp
00401045 C3 ret
|
|