Es imposible crear una variable C en ensamblador: el compilador de C tiene que saber acerca de la variable (es decir, su tipo y dirección), lo que significa que tiene que ser declarado en el código C.
Lo que se puede hacer es acceder a los símbolos definidos en el ensamblador mediante declaraciones extern
en C. Esto no funcionará para las variables con duración de almacenamiento automático, ya que no tienen una dirección fija pero están referenciadas con respecto a la base puntero.
Si no desea acceder a las variables fuera del bloque asm
, puede usar la pila para almacenar datos de ensamblador local. Hemos de tener en cuenta que tiene que restaurar el puntero de pila a su valor anterior a la salida del bloque de asm
, por ejemplo
sub esp, 12 ; space for 3 asm-local 32bit vars
mov [esp-8], 42 ; set value of local var
[...]
push 0xdeadbeaf ; use stack
[...] ; !!! 42 resides now in [esp-12] !!!
add esp, 16 ; restore esp
Si no desea que las direcciones relativas de las variables locales que cambiar cada vez que se manipula la pila (es decir, use push
o pop
), debe establecer un marco de pila (es decir, guardar la base de la pila en ebp
y direcciones locales en relación con este valor) como se describe en cedrou's answer.
¿está seguro de sub esp, 3 dará espacio para 3 de 32 bits vars? Tenía la idea de que para cada var de 32 bits tendría que tomar 4 de esp. –
Al menos C++ lo define internamente de la siguiente manera: var_4 = dword ptr -4 –
tiene razón, no debería responder preguntas tan tarde por la noche;) – Christoph