Вызов 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
вместо фактического адреса строки.
Я не могу объяснить, почему, похоже, после первого вызова стек поврежден? Нужно ли как-то его восстанавливать?