Montagem em linha do GCC com operação de empilhamento
Estou precisando de um código de montagem embutido:
eu tenhoum par(portanto, é equilibrado) da operação push / pop dentro da montagemEu também tenho uma variável na memória (então, não registro) como entradacomo isso:
__asm__ __volatile__ ("push %%eax\n\t"
// ... some operations that use ECX as a temporary
"mov %0, %%ecx\n\t"
// ... some other operation
"pop %%eax"
: : "m"(foo));
// foo is my local variable, that is to say, on stack
Ao desmontar o código compilado, o compilador fornece o endereço de memória como0xc(%esp)
, é relativo aesp
, portanto, esse fragmento de código não funcionará corretamente, pois tenho umpush
operação antesmov
. Portanto, como posso dizer à compilação que não gosto dafoo
relativo aesp
, mas qualquer coisa como-8(%ebp)
em relação ao ebp.
P.S. Você pode sugerir queEu posso colocareax
dentro do Clobbers, mas é apenas um código de amostra. Não gosto de mostrar toda a razão pela qual não aceito esta solução.