免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1476 | 回复: 0
打印 上一主题 下一主题

X86和ARM堆栈组织结构比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-17 13:54 |只看该作者 |倒序浏览
zu  作为硬件平台,arm和x86是比较有代表性的两个了。而在bootloader或操作系统编程方面,堆栈/参数传递/返回值是系统编程常常关注的一些内
容,对比他们的差异对理解操作系统会有所帮助
1          返回值:1)        X86采用eax作为返回值。
return i;
23:   c7 45 08 1e 00 00 00    movl   $0x1e,0x8(%ebp)
2a:   8b 45 08             mov    0x8(%ebp),%eax
2d:   89 c0                mov    %eax,%eax
2)        ARM使用r0作为返回值。
return i;
  44:      e50b3010      str r3, [fp, -#16]
  48:      e51b3010      ldr       r3, [fp, -#16]
  4c:      e1a00003      mov      r0, r3
2          参数传递1)        X86:主要是采用堆栈,除非指定以寄存器传递(通过“regparm (NUMBER)”注:NUMBER指定)。
如果指定寄存器传递参数,则eax为第一个参数,edx为第二个参数, ecx为第三个参数。
int hello(int );
t=hello(13);
9:     6a 0d            push   $0xd
b:     e8 fc ff ff ff       call  c
2)        ARM:寄存器到堆栈,首先将参数赋给r0, r1等,同时,未经优化的代码,在函数的堆栈中,也会为每个参数预留一个参数堆栈。
ARM的参数结构看起来比较奇怪,对其的解释是:出于效率考虑,如果在函数中的寄存器足够分配的话,则经过优化后,它不会进栈,而直接使用寄存器即可。这样的方式可以保证优化只局限于函数内部,实际上一般使用-O优化过的代码最终普遍在函数中不再进栈的。
int hello(int );
t=hello(13);
未优化:
10:   e3a0000d       mov r0, #13    ; 0xd  
14:   ebfffffe     bl     0
… …
……
3c:   e50b0010       str   r0, [fp, -#16]
优化后:
   4:      e3a0000d       mov r0, #13    ;

bl

  1c:      e1a0f00e        mov pc, lr





本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/2214/showart_5690.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP