c语言指针寄存器,在C+内联ASM中使用基指针寄存器

在C+内联ASM中使用基指针寄存器

我希望能够使用基本指针寄存器(%rbp)内嵌ASM。这方面的一个玩具例子如下:void Foo(int &x){

asm volatile ("pushq %%rbp;"         // 'prologue'

"movq %%rsp, %%rbp;"   // 'prologue'

"subq $12, %%rsp;"     // make room

"movl $5, -12(%%rbp);" // some asm instruction

"movq %%rbp, %%rsp;"  // 'epilogue'

"popq %%rbp;"         // 'epilogue'

: : : );

x = 5;}int main() {

int x;

Foo(x);

return 0;}

我希望如此,因为我使用的是通常的开场白/尾声函数-推陈出新的调用方法。%rbp这样就可以了。但是,当我试图访问x在内嵌ASM之后。

GCC生成的组装代码(稍微简化)是:_Foo:

pushq   %rbp

movq    %rsp, %rbp

movq    %rdi, -8(%rbp)

# INLINEASM

pushq %rbp;          // prologue

movq %rsp, %rbp;     // prologue

subq $12, %rsp;      // make room

movl $5, -12(%rbp);  // some asm instruction

movq %rbp, %rsp;     // epilogue

popq %rbp;           // epilogue

# /INLINEASM

movq    -8(%rbp), %rax

movl    $5, (%rax)      // x=5;

popq    %rbp

ret

main:

pushq   %rbp

movq    %rsp, %rbp

subq    $16, %rsp

leaq    -4(%rbp), %rax

movq    %rax, %rdi

call    _Foo

movl    $0, %eax

leave

ret

有人能告诉我为什么这个故障吗?我好像有点腐败%rbp但我看不出是怎么回事。提前谢谢。

我在64位Ubuntu 14.04上运行GCC 4.8.4。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值