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:
void Intercambiar(int* Lista, int i, int j);
int OrdenaPacientes(int* Lista, struct BCP* P, unsigned char criterio) {
int pid,num,i,j;
if( (criterio != CRIT_PRIO) && (criterio != CRIT_ALFA) )
return -1; //error
// Copiamos los indices de los BCPs ocupados
// a la lista
for( pid = 0, num = 0; pid < MAX_PACIENTES ; pid++ )
if( P[pid].prioridad != 0 ) {
Lista[num] = pid;
num++;
}
// Ordenamos la lista
if( criterio == CRIT_PRIO )
for( i = 0; i < num ; i++ ) {
j = PosMinPrioridad(Lista, P,i,num);
Intercambiar(Lista, i, j );
}
else
for( i = 0; i < num ; i++ ) {
j = PosMinAlfabetico(Lista, P,i,num);
Intercambiar(Lista, i, j );
}
return num;
}
Y aquí el código de la función Intercambiar en ASM:
.global Intercambiar
Intercambiar:
push {fp}
mov fp, sp
sub sp, #4
ldr r3, [r0, r2, lsl #2]
str r3, [fp, #-4]
ldr r3, [r0, r1, lsl #2]
str r3, [r0, r2, lsl #2]
ldr r3, [fp, #-4]
str r3, [r0, r1, lsl #2]
mov sp, fp
pop {fp}
mov pc, lr
.end
¿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.
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:
Citargcc -Wall -O -c main.c
Citargcc -c intercambiar.s
Citargcc -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.
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
Me ha dicho el profesor que ese es el problema, cambiar .s por .S.
Qué listos que son.