可冰

冰,是沉睡着的水......

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  37 随笔 :: 5 文章 :: 94 评论 :: 0 Trackbacks
  在汇编中,用CALL调用子程序时,处理器要保存当前的状态.但具体地来说,它会保存哪些寄存器的值呢?
首先保存的应该就是返回地址了吧,但这一过程可不可以用其它代码来显式的实现呢?也就是用push or mov等将它所做的工作代替,这样可能吗?

  另外,C/C++中的局部变量是在哪里分配的呢?我记得好像是在堆上,但不太清楚了.这一过程在汇编中是如何实现的呢?看过了C的反汇编代码还是没搞清楚啊.

posted on 2005-09-19 12:57 可冰 阅读(454) 评论(4)  编辑 收藏 引用 所属分类: Assembly

评论

# re: 学汇编想到的一些问题 2005-09-19 15:31 moonriver
C/C++中的局部变量是在哪里分配的呢?我记得好像是在堆上?

不可能吧!!!!   回复  更多评论
  

# re: 学汇编想到的一些问题 2005-09-19 18:22 可冰
哦,我查了一下,局部变量是在栈上的.
是我记错了,动态分配的空间才是从堆上分配.  回复  更多评论
  

# re: 学汇编想到的一些问题 2005-09-20 17:03 kevinlee
局部变量是在Stack上分配的,你看函数入口地方一般都有 修改 esp 的操作。  回复  更多评论
  

# re: 学汇编想到的一些问题 2005-09-20 18:30 可冰
9: int main()
10: {
0041F540 push ebp
0041F541 mov ebp,esp
0041F543 push 0FFFFFFFFh
0041F545 push offset __ehhandler$_main (45638Bh)
0041F54A mov eax,dword ptr fs:[00000000h]
0041F550 push eax
0041F551 mov dword ptr fs:[0],esp
0041F558 sub esp,17Ch
0041F55E push ebx
0041F55F push esi
0041F560 push edi
0041F561 lea edi,[ebp-188h]
0041F567 mov ecx,5Fh
0041F56C mov eax,0CCCCCCCCh
0041F571 rep stos dword ptr [edi]
     11: //wifstream wf( "utf8.txt" );
     12: std::wifstream wf;
0041F573 push 1
0041F575 lea ecx,[wf]
0041F57B call std::basic_ifstream<unsigned short,std::char_traits<unsigned short> >::basic_ifstream<unsigned short,std::char_traits<unsigned short> > (41D285h)
0041F580 mov dword ptr [ebp-4],0

是啊,这里有对esp,edi,ebp等的操作,但我不明白这是什么意思;-( 我还没学32位下的汇编呢.
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理