Estoy tratando de entender cómo funciona exactamente la pila, así que recrearé aquí un pequeño ejemplo con algunas preguntas.
Supongamos que tengo un pequeño código en ASM que hace lo siguiente:
(todo esto es x86, sintaxis Intel, Linux)
push ebp mov ebp, esp sub esp, 16 mov eax, 0xdeadbeef <-- let's call this 'local variable a' mov [ebp - 16], eax mov eax, 0xabcdabcd <-- let's call this 'local variable b' mov [ebp - 12], eax mov eax, 0xcacafafa <-- let's call this 'local variable c' mov [ebp - 8], eax mov eax, 0xdada1111 <-- let's call this 'local variable d' mov [ebp - 4], eax call 0x10101010 <------- pretend that is the real address of function_B mov esp, ebp pop ebp ret Ahora imagine que tengo una función C llamada function_B que se llama desde el código asm y se ve así:
asmlinkage void function_B(void){ //some code here... } ¿Cómo accedería a a , b , c y d desde function_B con código ASM en línea?
¿Funcionaría esto? ¿Debería hacerlo de otra manera?
uint32_t val_a; __asm__ __volatile__( ".intel_syntax noprefix;" "mov %0, dword [ebp + 4 + 4 + 0];" ".att_syntax;" : "=r" (val_a) ); uint32_t val_b; __asm__ __volatile__( ".intel_syntax noprefix;" "mov %0, dword [ebp + 4 + 4 + 4];" ".att_syntax;" : "=r" (val_b) ); Además, ¿cómo accedería a a , b , c y d si mi función se viera así:
asmlinkage void function_B(unsigned int val){ //some code here... }¿Qué pasa con esto?
void function_B(uint32_t fake){ uint32_t* poke = &fake; uint32_t a = poke[0]; uint32_t b = poke[1]; uint32_t c = poke[2]; uint32_t d = poke[3]; }Lo que le dará los valores de a, b, c y d con su código asm actual (que no está enviando ningún argumento a function_B). Si también desea pasar argumentos reales a function_B, aún puede agregar el falso después del último argumento real:
void function_B(unsigned int val,uint32_t fake)En realidad, es un poco más seguro hacerlo así (luego con asm en línea) ya que tiene más posibilidades de sobrevivir a las optimizaciones (como la omisión de marcos de pila). Pero sigue siendo un truco, por supuesto, y nada en lo que confiaría demasiado.