Llamar a printf en ASM en línea extendido

Estoy tratando de generar la misma cadena dos veces en ASM en línea extendido enCCG, en 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;
}

Ahora, la cadena se emite solo una vez. He intentado muchas cosas, pero creo que me faltan algunas advertencias sobre la convención de convocatoria. Ni siquiera estoy seguro de si la lista de clobber es correcta o si necesito guardar y restaurarRBP yRBX en absoluto.

¿Por qué la cadena no se emite dos veces?

Mirar con un depurador me muestra que de alguna manera cuando la cadena se carga enrdi por segunda vez tiene el valor0 en lugar de la dirección real de la cadena.

No puedo explicar por qué, ¿parece que después de la primera llamada la pila está dañada? ¿Tengo que restaurarlo de alguna manera?