Я хочу использовать регистр базового указателя (%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
, это было бы нормально. Тем не менее, это seg ошибки, когда я пытаюсь получить доступ к 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
Может ли кто-нибудь сказать мне, почему этот seg неисправен? Кажется, я как-то испортил %rbp
, но я не понимаю, как это сделать. Спасибо заранее.
Я запускаю GCC 4.8.4 на 64-битном Ubuntu 14.04.