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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Llamar a una función en ASM desde C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Llamar a una función en ASM desde C  (Leído 6,071 veces)
JonaLamper


Desconectado Desconectado

Mensajes: 394



Ver Perfil
Llamar a una función en ASM desde C
« en: 23 Abril 2014, 15:48 pm »

Buenas, tengo una función Intercambiar (en ASM) que es usada por otra en C. Cuando la función OrdenaPacientes usa Intercambiar, debería cogerla del código en ASM... Pero no lo hace y no sé por qué. Dejo los dos códigos:

Código C:

Código
  1. void Intercambiar(int* Lista, int i, int j);
  2.  
  3. int OrdenaPacientes(int* Lista, struct BCP* P, unsigned char criterio) {
  4.  
  5. int pid,num,i,j;
  6.  
  7.  
  8. if( (criterio != CRIT_PRIO) && (criterio != CRIT_ALFA) )
  9. return -1; //error
  10.  
  11. // Copiamos los indices de los BCPs ocupados
  12. // a la lista
  13. for( pid = 0, num = 0; pid < MAX_PACIENTES ; pid++ )
  14. if( P[pid].prioridad != 0 ) {
  15. Lista[num] = pid;
  16. num++;
  17. }
  18.  
  19. // Ordenamos la lista
  20. if( criterio == CRIT_PRIO )
  21. for( i = 0; i < num ; i++ ) {
  22. j = PosMinPrioridad(Lista, P,i,num);
  23. Intercambiar(Lista, i, j );
  24. }
  25. else
  26. for( i = 0; i < num ; i++ ) {
  27. j = PosMinAlfabetico(Lista, P,i,num);
  28. Intercambiar(Lista, i, j );
  29. }
  30. return num;
  31. }

Y aquí el código de la función Intercambiar en ASM:

Código
  1. .global Intercambiar
  2.  
  3.  
  4. Intercambiar:
  5. push {fp}
  6. mov fp, sp
  7. sub sp, #4
  8.  
  9. ldr r3, [r0, r2, lsl #2]
  10. str r3, [fp, #-4]
  11. ldr r3, [r0, r1, lsl #2]
  12. str r3, [r0, r2, lsl #2]
  13. ldr r3, [fp, #-4]
  14. str r3, [r0, r1, lsl #2]
  15.  
  16. mov sp, fp
  17. pop {fp}
  18. mov pc, lr
  19. .end
  20.  


En línea

Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


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


Ver Perfil WWW
Re: Llamar a una función en ASM desde C
« Respuesta #1 en: 23 Abril 2014, 16:10 pm »

¿Y cual es el error exactamente? ¿El enlazador no encuentra nunca el simbolo? ¿Que herramientas estas usando? Asegurate de estar compilando en C y no C++.

PD. No te olvides de la instruccion ret al final de una funcion.


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
Gh057


Desconectado Desconectado

Mensajes: 1.190



Ver Perfil
Re: Llamar a una función en ASM desde C
« Respuesta #2 en: 23 Abril 2014, 17:07 pm »

hola JonaLamper, así nunca lo he probado y recién en algunas horas podría trastear con ello... sin embargo teniendo el código en ensamblador separado, por ejemplo intercambiar.s y su cabecera intercambiar.h y llamándolo desde el main puedes compilarlo separados generando los objetos y enlázandolos luego, con:

Citar
gcc -Wall -O -c main.c

Citar
gcc -c intercambiar.s

Citar
gcc -o ordena_pacientes main.o intercambiar.o

lo ideal sería contruirte un "make" para automatizar todo y que la operación sea más inteligente, compilando los que vayas editando solamente... por ejemplo desde la ide anjuta te crea por defecto el mismo para el proyecto hasta con las  licencias libres que quieras agregar (a mi me gusta generar desde ahí el trabajo y luego ya me manejo con un par de terminales con nano.)

espero haberte ayudado en algo, saludos.
« Última modificación: 23 Abril 2014, 17:15 pm por Gh057 » En línea

4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...
noele1995

Desconectado Desconectado

Mensajes: 137



Ver Perfil
Re: Llamar a una función en ASM desde C
« Respuesta #3 en: 23 Abril 2014, 23:56 pm »

Es la practica numero 4 :) No te lo reconoce probablemente porque al archivo le has puesto extension .s(a mi tambien me ha pasado, lo pone en el enunciado), si lo remplazas por .asm te funcionara, si ese es el problema, deberia reconocerlo tambien con extension .S

Saludos
En línea

JonaLamper


Desconectado Desconectado

Mensajes: 394



Ver Perfil
Re: Llamar a una función en ASM desde C
« Respuesta #4 en: 24 Abril 2014, 00:57 am »

Me ha dicho el profesor que ese es el problema, cambiar .s por .S.

Qué listos que son.
En línea

Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
LLamar a una funcion desde lado cliente ASP.NET
.NET (C#, VB.NET, ASP)
USLO 0 2,512 Último mensaje 14 Mayo 2012, 15:57 pm
por USLO
Llamar a una función desde un string
Programación C/C++
prometheus48 4 2,807 Último mensaje 25 Mayo 2012, 20:57 pm
por prometheus48
[Resuelto] Como llamar a una función php desde ajax
PHP
yoelrodguez 2 4,164 Último mensaje 12 Mayo 2015, 01:06 am
por yoelrodguez
Llamar funcion de una clase php desde jquery
PHP
Ethgar 2 10,694 Último mensaje 26 Noviembre 2015, 18:04 pm
por #!drvy
llamar función php desde caja de texto con onchange
PHP
Drakaris 1 4,958 Último mensaje 24 Junio 2017, 19:06 pm
por 3n31ch
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines