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?