Llamar a una función en ASM desde C

Iniciado por JonaLamper, 23 Abril 2014, 15:48 PM

0 Miembros y 1 Visitante están viendo este tema.

JonaLamper

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:

Código (asm) [Seleccionar]
.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

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

¿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.
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

#2
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.
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

noele1995

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

JonaLamper

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

Qué listos que son.
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.