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 entrada

como 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.

questionAnswers(3)

yourAnswerToTheQuestion