Programación General > C/C++

 Pruebas en C

<< < (3/3)

jvmjunior:
Porfavor, puedes explicarnos este código ??  :


 int valor_pila()
 {
     __asm__("push %espnt"      
             "pop %eax");
 }

Gracias.
Saludos.

m0skit0:
Usa las etiquetas de código, colega...


--- Código: C ---int valor_pila(){    __asm__("push %espnt"    "pop %eax");} Suponía que no entendrías esto  ^_^

Hay que tener en cuenta que el código en C primero se pasa a ensamblador y posteriormente se ensambla y enlaza. Si quieres ver el código en ensamblador correspondiente, usa el modificador -S con gcc. Con la función __asm__() lo que estamos diciéndole al compilador de C es que no compile la cadena que vaya dentro de ella, sino que simplemente la pase tal cual al ensamblador. Con ello ejecutamos código en ensamblador desde C.

Luego hay que entender ciertos aspectos internos de las CPU Intel. Éstas usan un registro llamado ESP para apuntar al elemento más alto de la pila. Ésta función devuelve el valor de ese registro (puedes ver %esp). También existe el registro EAX, que es dónde las funciones guardan el valor de retorno. Por ejemplo, cuando haces return 0;, en realidad la CPU pone un cero en el registro EAX antes de volver de la función.

Por tanto nuestro código en ensamblador es:


--- Código: ASM ---push %esppop %eax La instrucción push inserta un elemento en la pila y la instrucción pop saca un elemento de la pila. Estas instrucciones se encargan internamente de cargar/salvar el valor de/en la pila en el registro correspondiente y modificar ESP para que apunte al siguiente valor. Entonces metemos el valor del registro ESP en la pila y luego sacamos ese mismo valor en EAX, así ya lo tenemos incluso como valor de retorno, así que finalizamos directamente la función.

Para los curiosos: no hemos hecho


--- Código: ASM ---mov %eax,%esp porque la instrucción mov en los procesadores x86 no acepta un registro de segmento como operando. Así que tenemos que recurrir al truco de la pila.

jvmjunior:
Perfecto....espero algun dia devolverte el favor.... sos muy bueno..


Muchas Gracias.

Saludos. :beer:  :good:

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa