Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JonaLamper en 23 Abril 2014, 15:48 pm



Título: Llamar a una función en ASM desde C
Publicado por: JonaLamper 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.  


Título: Re: Llamar a una función en ASM desde C
Publicado por: Eternal Idol 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.


Título: Re: Llamar a una función en ASM desde C
Publicado por: Gh057 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.


Título: Re: Llamar a una función en ASM desde C
Publicado por: noele1995 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


Título: Re: Llamar a una función en ASM desde C
Publicado por: JonaLamper 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.