elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Pasar argumentos a una función externa de C desde NASM
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Pasar argumentos a una función externa de C desde NASM  (Leído 6,433 veces)
huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Pasar argumentos a una función externa de C desde NASM
« en: 26 Febrero 2019, 02:22 am »

Hola de nuevo aquí, veo que esta sección es algo relajada.
En fin, me gustaría saber como puedo pasar argumentos a una función de C desde NASM.
Ejemplo tengo una función en C declarada así:
Código
  1. void k_readkb(char* buf, int n);
Como podria pasar un argumento que tengo en ecx (a ecx se mueve un puntero a un area de memoria, que es un buffer, donde se dejaran los caracteres, un resb en .bss) hacia el primer argumento de la función de C y edx al 2do argumento de la función? Y en caso de que tenga más argumentos?
Me lio un poco con los registros, y no he encontrado mucho acerca de esto.
Saludos.


En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Pasar argumentos a una función externa de C desde NASM
« Respuesta #1 en: 26 Febrero 2019, 07:29 am »

Entiendo que quieres usar una función de C en NASM.

Los parámetros se pasan a las funciones como si fueran un array, en este caso es una pila. En esa pila se van pasando los parámetros por medio, como sabrás, del push. Del último al primero, por lo tanto primero debes meter el entero (n) y luego el puntero (buf). Lógicamente se entiende que sabes que son los punteros y esas cosas. En la pila de los parámetros no pasas la cadena, pasas un puntero, una dirección de memoria.

Ten cuidado porque hay manejas punteros, tienes que reservar la memoria y liberarla, y para más inri lo mismo con los registros, una vez haces un push recuerda que luego debes hacer un pop para recuperar el estado anterior a la llamada de la función.

Ejemplo (Visual Studio (0x86) + NASM Win32):
Código
  1. #include <iostream>
  2.  
  3. extern "C" void funcionEnCpp(char * cadena, int valor) {
  4. std::cout << "cadena=" << cadena << "valor= "<< valor << "\n";
  5. system("PAUSE");
  6. }


Código
  1. extern _funcionEnCpp
  2.  
  3. section .data
  4.    cadena: db "Hola asm",8,0
  5.  
  6. section .text
  7.  
  8. global _main:
  9.  
  10. _main:
  11.        ; *** pasamos los parámetros ***
  12. mov eax, 55
  13. push eax ; metemos el valor
  14. push cadena; metemos el puntero de la cadena
  15.        ; ***************************
  16.  
  17. call _funcionEnCpp ; llamamos la funcion
  18.  
  19.        ; *** vaciamos la pila ***
  20. pop eax
  21. pop eax
  22.        ; ********************
  23.  
  24. mov eax, 0 ; retornamos todo OK
  25. ret


« Última modificación: 26 Febrero 2019, 16:35 pm por srWhiteSkull » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Pasar argumentos a una función externa de C desde NASM
« Respuesta #2 en: 26 Febrero 2019, 09:52 am »

El primer push eax (linea 11) sobra.

La convencion de llamada depende principalmente de la plataforma (hardware y software).

https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Pasar argumentos a una función externa de C desde NASM
« Respuesta #3 en: 26 Febrero 2019, 16:29 pm »

La convencion de llamada depende principalmente de la plataforma (hardware y software).

https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl

Es cierto.
En línea

huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: Pasar argumentos a una función externa de C desde NASM
« Respuesta #4 en: 26 Febrero 2019, 17:53 pm »

Gracias, pero no se por que se queda en el limbo, osea no se ejecuta la función k_readkb.
No puedo usar eax para el número ya que lo estoy usando para otra cosa (en cambio debo usar edx), y debo mover el buffer (modificable) a ecx
Código
  1.    xor eax, eax
  2.    push edx
  3.    push ecx
  4.    call k_readkb
  5.    pop ecx
  6.    pop edx
  7.    jmp isr_common_stub
  8.  
El buffer es algo así (section .bss):
Código
  1. instr resb 255
(estoy compilando con GCC)
« Última modificación: 26 Febrero 2019, 18:02 pm por hextakatt » En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: Pasar argumentos a una función externa de C desde NASM
« Respuesta #5 en: 26 Febrero 2019, 20:36 pm »

Puedes usar cualquier registro en uso, es más todos los registros suelen estar usados en los procesos del sistema que comparte con tú programa pero lo habitual en asm es guardar sus estados, push o mov, y luego recuperarlos, pop o mov. Posiblemente esto te puede ir grande aunque si inviertes tiempo en aprender seguro que luego sacas eso con menos dificultad.

Por ejemplo, en la porción que muestras usas eax y lo inicias a cero mediante un xor.

Si la variable de la cadena es instr es esa la que tienes que usar no entiendo que haces con ese edx y ese ecx, no se ve en el código que contienen.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Pasar argumentos a una función externa de C desde NASM
« Respuesta #6 en: 26 Febrero 2019, 21:14 pm »

hextakatt vas a tener que buscar una forma de depurar tu codigo ...

Normalmente hay registros que se preservan entre llamadas, hay que ver la convencion de nuevo, aunque en tu caso hextakatt vas a tener que respetar mas que nada lo que haga tu compilador.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Pasar argumentos a una función externa de C desde NASM
« Respuesta #7 en: 26 Febrero 2019, 22:47 pm »

Hola

Yo tambien estoy de acuerdo en lo del sistema de llamadas, como comentaron los compañeros mas arriba, se me hace dificil entender que un sistema actual, no utilize el sistema de llamadas syscall. Te recomiendo que mires algun binario como un hello world compilado por ti en tu equipo, y te fijes en el sistema de llamada que esta usando.

Un saludo.
En línea

huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: Pasar argumentos a una función externa de C desde NASM
« Respuesta #8 en: 27 Febrero 2019, 01:49 am »

Hola

Yo tambien estoy de acuerdo en lo del sistema de llamadas, como comentaron los compañeros mas arriba, se me hace dificil entender que un sistema actual, no utilize el sistema de llamadas syscall. Te recomiendo que mires algun binario como un hello world compilado por ti en tu equipo, y te fijes en el sistema de llamada que esta usando.

Un saludo.
Em... Pasa que estoy programando algo más complejo y no estoy en ningún sistema operativo en concreto.
En línea

xv0


Desconectado Desconectado

Mensajes: 1.027



Ver Perfil
Re: Pasar argumentos a una función externa de C desde NASM
« Respuesta #9 en: 27 Febrero 2019, 13:38 pm »

Pero si creas una funcion C y compilas, y depuras el codigo como pasa los parametros la funcion? Con el binario creado por el compilador, miratelo con gdb mismo.

Un saludo.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
manejo de argumentos en funcion dentro de funcion ???
PHP
SpiderNet 2 3,578 Último mensaje 30 Septiembre 2008, 03:01 am
por SpiderNet
pasar argumentos por un CreateThread? « 1 2 »
Programación C/C++
while 11 9,801 Último mensaje 14 Octubre 2010, 23:41 pm
por Eternal Idol
como pasar variable de una a otra desde una funcion « 1 2 »
Programación C/C++
geshiro 16 8,094 Último mensaje 22 Mayo 2016, 03:51 am
por geshiro
[c++11] ¿Como pasar n argumentos a una función?
Programación C/C++
carl0s_47 5 3,686 Último mensaje 8 Marzo 2017, 18:40 pm
por ivancea96
Pasar argumentos a una función saliendo de una caja de texto con <Enter>.
Scripting
El mas antiguo 2 4,609 Último mensaje 12 Febrero 2022, 13:51 pm
por El mas antiguo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines