Chamando printf em ASM embutido estendido

Estou tentando gerar a mesma string duas vezes no ASM embutido estendido emGCC, no Linux de 64 bits.

int main()
{
    const char* test = "test\n";

    asm(
        "movq %[test], %%rdi\n"    // Debugger shows rdi = *address of string*  
        "movq $0, %%rax\n"

        "push %%rbp\n"
        "push %%rbx\n"
        "call printf\n"         
        "pop %%rbx\n"
        "pop %%rbp\n"

        "movq %[test], %%rdi\n" // Debugger shows rdi = 0
        "movq $0, %%rax\n"

        "push %%rbp\n"
        "push %%rbx\n"
        "call printf\n"     
        "pop %%rbx\n"
        "pop %%rbp\n"
        : 
        :  [test] "g" (test)
        : "rax", "rbx","rcx", "rdx", "rdi", "rsi", "rsp"
        );

    return 0;
}

Agora, a string é emitida apenas uma vez. Eu tentei muitas coisas, mas acho que estou perdendo algumas ressalvas sobre a convenção de chamada. Não tenho certeza se a lista de descargas está correta ou se preciso salvar e restaurarRBP eRBX em absoluto.

Por que a string não é exibida duas vezes?

Olhar com um depurador me mostra que, de alguma forma, quando a string é carregada nordi pela segunda vez, tem o valor0 em vez do endereço real da string.

Não sei explicar por que, parece que após a primeira chamada a pilha está corrompida? Preciso restaurá-lo de alguma forma?

questionAnswers(1)

yourAnswerToTheQuestion