• Miércoles 20 de Noviembre de 2024, 18:39

Autor Tema:  Rutinas En Ensamblador  (Leído 5253 veces)

sspiegel

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Rutinas En Ensamblador
« en: Viernes 29 de Junio de 2007, 15:31 »
0
Hola a todos,

Estoy tratando de utilizar rutinas escritas en ensamblador desde un fichero escrito en C, pero no logro que funcione. Esto es lo que he provado:

uno.c :

#include "rut1.h"

extern void Inici(void);

void main()
{
  Inicio();
}
----------------------------------------------
rut1.h :

extern void Inicio(void);
----------------------------------------------
rut1.asm :

PUBLIC _Inicio

_DATA   SEGMENT WORD PUBLIC 'DATA'
_DATA   ENDS

_BSS    SEGMENT WORD PUBLIC 'BSS'
_BSS    ENDS

DGROUP  GROUP   _DATA, _BSS

ASSUME cs:RUTINAS, ds:DGROUP

RUTINAS SEGMENT BYTE PUBLIC 'CODE'

_Inicio   PROC FAR  
               ; aqui va el codigo en asm
               ret
_Inicio ENDP

RUTINAS ENDS
----------------------------------------------

Al compilar con CCS C me señala la palabra "extern" del fichero rut1.h y me da el error: "A #DEVICE required before this line"

Alguien sabe como se tiene que hacer para usar rutinas en asm desde C?
Saludos y gracias,

Fran

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #1 en: Viernes 29 de Junio de 2007, 19:59 »
0
asegurate que en el archivo *.h al que C primero apunta este esto

#include <16f873A.h> //esto cambia segun el micro que usas

#device *=16; // esto significa que el compilador agrerara el codigo de soporte para manejar los registro del micro como si estuvieran en un direccionamiento lineal (no por bancos)

sspiegel

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #2 en: Sábado 30 de Junio de 2007, 12:57 »
0
Hola a todos,

Gracias lalo_soft por el consejo. Se ha solucionado el problema del "Device". Ahora lo que dice es "Funcion usada pero no definida: Inicio" (en ingles) dentro del fichero uno.c

Si dentro del fichero rut1.h cambio "extern" por "public" el error es otro: "esperando un ("

¿Cómo soleis hacerlo para poner diferentes funciones en ficheros separados?
Saludos,
Fran

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #3 en: Sábado 30 de Junio de 2007, 16:54 »
0
no me queda claro tu problema puntual.

sspiegel

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #4 en: Sábado 30 de Junio de 2007, 19:07 »
0
Hola,

Lo que pretendo hacer es crear unas librerias y poder usarlas desde otro fichero, pero no encuentro la manera. El compilador de C que uso es el CCS C.

Saludos y gracias

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #5 en: Domingo 1 de Julio de 2007, 15:39 »
0
Eso es facil

EJ:

Lib1.h // aqui colocas los prototipos,otros includes,variables y constantes que maneja la
lib.

Lib1.c // aqui el primer include sera #include "lib1.h", luego el desarrollo de cada funcion especificada en el lib1.h


Por ultimo tenemos la app que usara la libreria.


ejemplo app.c:


#include "path\lib1.h" //path sera nesesario si la lib esta en un directorio distinto al de la app.

// aqui otros include que vallas a ocupar


void main (void)
{
  bla..bla
 

}

sspiegel

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #6 en: Lunes 2 de Julio de 2007, 16:28 »
0
Hola lalo_soft,

He provado de hacerlo como dices, pero esta vez me marca un error en el fichero .h sobre la palabra "void" diciendo "Expecting a (".

los ficheros que tengo son estos:

cpp.c :

#include "rut1.h"

extern void Inicio();

void main (void)
{
   Inicio();
}
---------------------------
rut1.h :

#include <16f877.h>
#device *=16;

public void Inicio();
---------------------------

rut1.c :

#include "rut1.h"

int valor=5;

public void Inicio(){
 //codigo
}
---------------------------

No se si sera del compilador de C o si todavia hago algo mal. Saludos,
Fran

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #7 en: Jueves 5 de Julio de 2007, 17:02 »
0
¿por que tienes  definida la misma funcion en el *.h y *.c?

sspiegel

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #8 en: Viernes 6 de Julio de 2007, 11:17 »
0
Hola,

tengo definida la misma funcion en .h i en .c porque en el ejemplo que pusiste dentro del .c dice: "luego el desarrollo de cada funcion especificada en el lib1.h"
yo entiendo esto como que se ponen las cabeceras de las funciones en .h y el codigo de las funciones en el .c, que es como se suele hacer en otros compiladores de C. Saludos,
Fran

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #9 en: Viernes 6 de Julio de 2007, 16:58 »
0
No es nesesario  colocarla en cpp.c ya que con eso esas dando una nueva definicion a lo que fue definido en el *.h, tampoco te aconsejo usar los pre public,extern ya que eso te
provocara confusion cuando migres a C++ que es el paso siguiente, por que varios compiladores ya soportan C++ para micros como el pic

sspiegel

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Rutinas En Ensamblador
« Respuesta #10 en: Jueves 12 de Julio de 2007, 16:49 »
0
Hola lalo_soft

Gracias por el consejo.

He quitado la linea de código "extern void Inicio();" del cpp.c, pero me abre el fichero rut1.h señalando el texto "void I" (la linea entera es "public void Inicio();" )
y a bajo me marca en rojo el error "Expecting a ("

Saludos,
Fran