朋友们帮个忙,谢谢

wjb_yd 2008-08-03 09:57:02
小弟,刚学汇编,很多地方都不懂,用vc6写程序的时候,每次看反汇编代码都有这么几行,哪位大哥大姐帮我解释一下,这几行都有什么作用,谢谢了!!!

push ebp
mov ebp,esp
sub esp,4Ch
push ebx
push esi
push edi
lea edi,[ebp-4Ch]
mov ecx,13h
mov eax,0CCCCCCCCh
rep stos dword ptr [edi]

还有,return 0之后为什么要这样?
xor eax,eax
...全文
91 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjb_yd 2008-08-04
  • 打赏
  • 举报
回复
大哥,你太猛了,我没有汇编基础啊,这就回家种地去!
gzgzlxg 2008-08-03
  • 打赏
  • 举报
回复
push ebp //保存ebp
mov ebp, esp //当前堆栈指针送入ebp
sub esp, 4Ch //VC++ 的缺省堆栈空间大小,以Byte(字节)单位
push ebx //保存ebx
push esi //保存esi
push edi //保存edi
lea edi,[ebp-4Ch] //取堆栈底指针
mov ecx, 13h //堆栈长度,以dword(双字)为单位,即那个4Ch / 4
mov eax, 0CCCCCCCCh //用来填写堆栈空间的字符,一般编译器这里都是0,VC++怕将来别人不知道是它
//编译的,这里用来提醒你,我是VC++,我是VC++...,就这样一路叫着
rep stos dword ptr[edi] //开始唱那首"我是VC++的歌

xor eax, eax //等于 mov eax, 0 一般许多程序员习惯使用 xor eax, eax
如果放在 return 0 之后,那就是编译器随便填的分割符号,例如Delphi喜欢填 lea eax, [eax+0]。
不过我看这个 xor eax, eax 应该是另一个小程序的起始,这种情况一般都是某个模块中间要调用这段代码,一般后面还应该有几句,例如:
xor eax, eax
mov [ebp+0Ch] ,eax
mov [ebp+10h], eax
ret
VC++两个程序之间一般填写0Ch ,原因同前,喜欢唱那首歌。0CCh是一个非常特殊的执行代码,只有一个字节,即在debug调试中使用的那个 int 3。debug 调试下断点一般有两种方式,一个就是由硬件提供的所谓的硬件中断,另外一个就是所谓的软件中断,使用OllyDBG的时候,按F2下断点,其实就是在那个地方将原来的代码用这个0CCh来替换,当执行到这里的时候,即触发软件中断3,这样debug就接管了控制权。
VC++编译器有时候也会清醒一下,这个时候就会填,90h。90h也是一个特殊的执行代码,用nop表示,那就是什么都不干,让cpu空转,或者说,让cpu小憩一下。

gzgzlxg 2008-08-03
  • 打赏
  • 举报
回复
楼主还不给分,再不给,我就要骂娘了,我写的这么辛苦,就是为了多几个角,然后在用三角去换那颗星。
xcntime 2008-08-03
  • 打赏
  • 举报
回复
都是牛人啊,我得回家种红薯得了,,,

yeliguo12345 2008-08-03
  • 打赏
  • 举报
回复
不太懂,帮顶
cnzdgs 2008-08-03
  • 打赏
  • 举报
回复
在函数调用过程中,栈的主要作用有:传递参数、记录返回地址、保护寄存器的值、分配局部(动态)变量的储存空间。
函数调用时,先把各个参数push到栈中,然后call函数入口地址(返回地址自动入栈)。在执行到函数入口时,esp指向的内存地址中储存的是函数执行完后要返回的地址,后面储存的是各个参数。
push ebp、mov ebp,esp之后,就可以利用ebp来访问函数的参数了,ebp指向的是进入函数前的ebp值,push ebp的作用就是保存ebp原来的值,ebp+4处是函数返回的地址,ebp+8开始是各个参数。
sub esp,4Ch是给局部变量分配储存空间,之后可以用ebp-n的方式来访问,具体分配空间的大小与函数使用局部变量的情况有关,你上面这段代码是VC用Debug配置编译的,Debug配置会多分配一些空间以便调试,Debug配置会把这些空间都初始化为0xCC。如果你用Release配置来编译,就不会分配多余的空间了,变量也不会自动初始化为0xCC。
push ebx、push esi、push edi是保护寄存器,函数返回前再pop出来,使函数返回后这些寄存器的值保持不变,以便继续使用。
后面的代码就是把分配的空间初始化为0xCC。
gzgzlxg 2008-08-03
  • 打赏
  • 举报
回复
你还真够可以的,我都不知道怎么说好了。
你自己用OllyDBG随便打开一个用VC++编译出来的程序,只要没有加上那些优化代码的编译条件,都可以看到这类的代码。
我随便写了几句代码,就见到一个和你所说的一样的东西,如下:

00401290 55 push ebp
00401291 8BEC mov ebp,esp
00401293 83EC 4C sub esp,4C
00401296 53 push ebx
00401297 56 push esi
00401298 57 push edi
00401299 8D7D B4 lea edi,[ebp-4C]
0040129C B9 13000000 mov ecx,13
004012A1 B8 CCCCCCCC mov eax,CCCCCCCC
004012A6 F3:AB rep stos dword ptr es:[edi]

再看看这段代码运行前后堆栈的内容:
初始化前:
0012FE5C 00 00 00 00 10 29 38 00 70 E8 FC 77 30 C8 00 00 ....)8.p椟w0?.
0012FE6C 30 C8 00 00 B0 FF 12 00 64 7E FB 77 50 16 F8 77 0?.?.d~鹷P鴚
0012FE7C FF FF FF FF 98 FE 12 00 52 D5 40 00 00 00 38 00 橚.R誁...8.
0012FE8C 61 00 00 40 80 FF 12 00 63 65 40 00 C0 29 38 00 a..@€.ce@.?8.
0012FE9C CD 00 00 00 00 C8 00 00 80 FF 12 00 ?...?.€.
初始化候:
0012FE5C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫烫烫烫
0012FE6C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫烫烫烫
0012FE7C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫烫烫烫
0012FE8C CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫烫烫烫
0012FE9C CC CC CC CC CC CC CC CC CC CC CC CC 烫烫烫烫烫烫.

就这么多了,再弄不懂,回家种红薯得了。

BAYNPU 2008-08-03
  • 打赏
  • 举报
回复
mov ecx, 13h
mov eax, 0CCCCCCCCh
rep stos dword ptr[edi] ;串存储:ES:[EDI]-EAX,(EDI)-(EDI)_+_/4,返回REP指令要从堆栈弹出双字作为返回地址的偏移.
wjb_yd 2008-08-03
  • 打赏
  • 举报
回复
mov ecx, 13h
mov eax, 0CCCCCCCCh
rep stos dword ptr[edi]

这三句话的作用就是把ss:sp-ss:bp的内容全部填充为vc++特有的 0CCCCCCCCh ,是么?
也就是分配给这个程序的栈的初始内容就是 0CCCCCCCCh ?

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧