Вызов printf в расширенном встроенном ASM

Я пытаюсь вывести одну и ту же строку дважды в расширенном встроенном ASM вНКУна 64-битном 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;
}

Теперь строка выводится только один раз. Я перепробовал много вещей, но я предполагаю, что пропускаю некоторые предостережения о соглашении о вызовах. Я даже не уверен, что список клобберов правильный, или мне нужно сохранить и восстановитьКПБ а такжеRBX совсем.

Почему строка не выводится дважды?

Взгляд с отладчиком показывает мне, что как-то, когда строка загружается вrdi во второй раз это имеет значение0 вместо фактического адреса строки.

Я не могу объяснить, почему, похоже, после первого вызова стек поврежден? Нужно ли как-то его восстанавливать?