CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他开发语言 >  汇编语言

谁能跟我解释一下函数调用的传参,跳转,保存CPU当前状态等

楼主jara(一怒拔剑)2006-05-01 20:41:41 在 其他开发语言 / 汇编语言 提问

int   sum;  
  main()  
  {  
  sum=add(2,3);  
  }  
  add(int   a,int   b)  
  {  
  int   t;  
  t=a+b;  
  return   t;  
  }  
   
  用这个c程序生成的部分汇编代码是  
  _main   proc   near  
  mov   ax,20  
  push   ax  
  mov   ax,10  
  push   ax  
  call   near   ptr   _add  
  pop   cx  
  pop   cx  
  mov   word   ptr   dgroup:_sum,ax  
  ret  
  _main   endp  
  _add   proc   near  
  push   si  
  push   bp  
  mov   bp,sp  
  mov   si,word   ptr   [bp+6]  
  add   si,word   ptr   [bp+8]  
  mov   ax,si  
  pop   bp  
  pop   si  
  ret  
  _add   endp  
  …  
  public   _sum  
  public   _add  
  public   _main  
  …  
  在函数add中的t是局部变量应该是放在栈中的,除了这个函数,那么就不可见了,那么在汇编里怎么体现呢?还有这个函数调用的哪几句是传参数的?  
  push   bp  
  mov   bp,sp  
  这两句经常看到,是啥意思啊 问题点数:50、回复次数:6Top

1 楼feny911(春韭秋菘)回复于 2006-05-01 21:10:24 得分 30

楼主的代码有问题啊,你确定C源码和汇编码都没错吗?  
   
  mov   si,word   ptr   [bp+6]  
  add   si,word   ptr   [bp+8]  
  取得参数  
   
  push   bp  
  mov   bp,sp  
  桢操作  
   
  push   si  
  pop   si  
  保存CPU当前状态  
  Top

2 楼jara(一怒拔剑)回复于 2006-05-01 21:34:08 得分 0

 
  重新贴一下c和汇编代码  
  C;  
   
  main()  
  {  
    int   sum;  
    sum=add(2,3);  
  }  
  add(int   a,int   b)  
  {  
  int   t;  
  t=a+b;  
  return   t;  
  }  
  汇编  
  _main:  
  push   bp  
  mov   bp,sp  
  sub   sp,0002  
   
  mov   ax,0003  
  push   ax  
  mov   ax,0002  
  push   as  
  call   _add  
  pop   cx  
  pop   cx  
  ....  
   
  _add:  
  push   bp  
  mov   bp,sp  
  push   si  
   
  mov   si,[bp+04]  
  add   si,[bp+06]  
  mov   ax,si  
  pop   si  
  pop   bp  
  ret  
  ret  
  Top

3 楼mydo(侯佩|hopy|ks)回复于 2006-05-01 21:35:15 得分 20

push   bp  
  mov   bp,sp  
   
  保存bp和堆栈指针sp,为后面用   bp   引用栈中变量和恢复sp与bp作准备。Top

4 楼jara(一怒拔剑)回复于 2006-05-01 21:43:08 得分 0

我觉得  
  mov   si,[bp+04]  
  add   si,[bp+06]  
  有问题。  
  应该是  
  mov   si,[bp+06]  
  add   si,[bp+08]  
  因为push了两个参数,call的时候又push了返回地址,然后又push了si  
  所以我觉得应该两个参数应该在   bp+06和bp+08的位置  
  可是为什么反汇编出来会是这个结果  
  Top

5 楼feny911(春韭秋菘)回复于 2006-05-02 01:58:58 得分 0

我觉得  
  mov   si,[bp+04]  
  add   si,[bp+06]  
  有问题。  
  应该是  
  mov   si,[bp+06]  
  add   si,[bp+08]  
  因为push了两个参数,call的时候又push了返回地址,然后又push了si  
  所以我觉得应该两个参数应该在   bp+06和bp+08的位置  
  可是为什么反汇编出来会是这个结果  
  //////////////////////////////////////////  
  你第一次贴的代码是  
  push   si  
  push   bp  
  mov   bp,sp             ;;先push   si   再   mov   bp,sp  
  mov   si,[bp+06]  
  add   si,[bp+08]  
  第二次贴的时候,  
  push   bp  
  mov   bp,sp  
  push   si                 ;;先mov   bp,sp   再   push   si    
  mov   si,[bp+04]  
  add   si,[bp+06]  
  ;;push   si   对bp没有影响。[bp]为被保存的原bp的值。[bp+2]为返回地址。[bp+4]为第一个参数。  
   
  问一下,楼主用DOS吗?居然是16位寻址。  
  Top

6 楼jara(一怒拔剑)回复于 2006-05-02 11:45:36 得分 0

研究了一上午,终于全部搞懂了  
  结贴Top

相关问题

关键词

得分解答快速导航

  • 帖主:jara
  • feny911
  • mydo

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo