Используя регистр указателя базы в C ++, встроенный asm
Я хочу использовать регистр указателя базы %rbp
) в рамках встроенного ассм. Игрушечный пример этого выглядит так:
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
после встроенного асма.
Генерируемый 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
но я не понимаю как. Заранее спасибо
Я использую GCC 4.8.4 на 64-битной Ubuntu 14.04.