在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。