免费注册 查看新帖 |

Chinaunix

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

[C] main函数的在调用其他函数前栈帧的困惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-15 17:08 |只看该作者 |倒序浏览
c代码如下:(省去了函数)
int main() {
  int a[11] = {49,38,65,97,26,13,27,49,55,4,5};
  insertsort(a, 11);
}
汇编代码如下:(call insertsort以后都省去了)
080484da <main>:
80484da:        8d 4c 24 04                  lea    0x4(%esp),%ecx
80484de:        83 e4 f0                     and    $0xfffffff0,%esp
80484e1:        ff 71 fc                       pushl  -0x4(%ecx)
80484e4:        55                             push   %ebp
80484e5:        89 e5                          mov    %esp,%ebp
80484e7:        51                                   push   %ecx
80484e8:        83 ec 34                     sub    $0x34,%esp
80484eb:        65 a1 14 00 00 00            mov    %gs:0x14,%eax
80484f1:        89 45 f4                     mov    %eax,-0xc(%ebp)
80484f4:        31 c0                          xor    %eax,%eax
80484f6:        c7 45 c8 31 00 00 00         movl   $0x31,-0x38(%ebp)
80484fd:        c7 45 cc 26 00 00 00         movl   $0x26,-0x34(%ebp)
8048504:        c7 45 d0 41 00 00 00         movl   $0x41,-0x30(%ebp)
804850b:        c7 45 d4 61 00 00 00         movl   $0x61,-0x2c(%ebp)
8048512:        c7 45 d8 1a 00 00 00         movl   $0x1a,-0x28(%ebp)
8048519:        c7 45 dc 0d 00 00 00         movl   $0xd,-0x24(%ebp)
8048520:        c7 45 e0 1b 00 00 00         movl   $0x1b,-0x20(%ebp)
8048527:        c7 45 e4 31 00 00 00         movl   $0x31,-0x1c(%ebp)
804852e:        c7 45 e8 37 00 00 00         movl   $0x37,-0x18(%ebp)
8048535:        c7 45 ec 04 00 00 00         movl   $0x4,-0x14(%ebp)
804853c:        c7 45 f0 05 00 00 00         movl   $0x5,-0x10(%ebp)
8048543:        6a 0b                        push   $0xb
8048545:        8d 45 c8                     lea    -0x38(%ebp),%eax
8048548:        50                             push   %eax
8048549:        e8 ed fe ff ff               call   804843b <insertsort>

以下是我写的main栈帧,不知对不对。

问题1:保存的%ecx和金丝雀上面的是什么?
问题2:  这栈帧在调用函数前保证了16个字节对齐了么?
问题3:  与上述代码无关:
           call 804846b <BinarySearch>
           add $0xc,%esp   
           sub $0x8,%esp
           push %eax
           push $0x8048610
           call 8048330 <printf@plt>
           同样在main函数里调用两个函数,但调用printf前比前一个函数时栈帧多了4个字节,保证了对齐了么?
可能有点长,麻烦了

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
2 [报告]
发表于 2016-01-18 15:36 |只看该作者
汇编 不会,帮你顶!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP