Используя регистр указателя базы в 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.

Ответы на вопрос(2)

Ваш ответ на вопрос