免费注册 查看新帖 |

Chinaunix

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

关于GCC中的call_used_regs [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-04 19:29 |只看该作者 |倒序浏览
本帖最后由 lazy_linux 于 2014-08-04 21:36 编辑

在gcc/config/i386/i386.h中定义了CALL_USED_REGS,文中中介绍说,如果call_used_regs\[i\] 等于0,
那么在进入函数时应先保存该寄存器i的值,在函数返回后要恢复该寄存器i的值。

我用gdb对编译出的编译器进行调试,有如下结果:
(gdb) print call_used_regs
$11 = "\001\001\001\000\000\000\000", '\001' <repeats 46 times>
这四个寄存器分别是bx, si, di, bp。

写了一个测试程序:
[GCC@localhost test]$ cat func_call.c
int f(){
return 1;
}


int main(int agrc, char *argv[]){
int i;
        i = f();
        return i;
}

但是在生成的汇编代码如下:
[GCC@localhost test]$ cat func_call.s
        .file        "func_call.c"
        .text
.globl f
        .type        f, @function
f:
        pushl        %ebp
        movl        %esp, %ebp
        movl        $1, %eax
        popl        %ebp
        ret
        .size        f, .-f
.globl main
        .type        main, @function
main:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $16, %esp
        call        f
        movl        %eax, -4(%ebp)
        movl        -4(%ebp), %eax
        leave
        ret
        .size        main, .-main
        .ident        "GCC: (GNU) 4.4.0"
        .section        .note.GNU-stack,"",@progbits

函数f进入和退出时值保存和恢复了bp的值,其它的寄存器为什么没有处理呢?
是我对CALL_USED_REGS理解不对吗?

请斑竹和各位指点,谢谢!!


论坛徽章:
0
2 [报告]
发表于 2014-08-09 15:41 |只看该作者
hi,
由于在f函数里面并没有对bx, si, di这三个寄存器进行写操作,所以在f函数的prologue和epilogue没有保存和恢复这三个寄存器。

论坛徽章:
0
3 [报告]
发表于 2014-11-10 16:14 |只看该作者
回复 2# helloluojie

非常感谢!
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP