ufruf von printf in erweitertem Inline-A

Ich versuche, dieselbe Zeichenfolge zweimal in Extended Inline ASM in @ auszugebe GCC, unter 64-Bit-Linux.

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;
}

Now, der String wird nur einmal ausgegeben. Ich habe viele Dinge ausprobiert, aber ich vermisse einige Vorbehalte bezüglich der Calling Convention. Ich bin mir nicht mal sicher, ob die Clobber-Liste korrekt ist oder ob ich @ speichern und wiederherstellen mus RBP und RBX überhaupt

Warum wird der String nicht zweimal ausgegeben?

Mit einem Debugger schauen zeigt mir, dass irgendwie, wenn der String in @ geladen wirdi hat zum zweiten Mal den Wert0 anstelle der tatsächlichen Adresse des Strings.

Ich kann nicht erklären, warum der Stack nach dem ersten Aufruf beschädigt ist. Muss ich es irgendwie wiederherstellen?