Autor Tema: Equivalencias entre ensamblador y C  (Leído 3079 veces)

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

Desconectado Salty

  • PIC10
  • *
  • Mensajes: 15
Equivalencias entre ensamblador y C
« en: 26 de Noviembre de 2014, 09:08:57 »
Buenos días, estoy haciendo un proyecto en C en un PIC18f46k22, con el compilador XC8.

Soy bastante novata en esto y necesito ayuda con algunas instrucciones en ensamblador que tengo que poner en c.

También he oído que hay una forma de poner instrucciones en ensamblador en el programa en c, cualquiera de las dos opciones me vale en un principio aunque preferiría el equivalente en c.

Las instrucciones en ensamblador son las siguientes:

1-        LFSR  0,BUFFER_ENT"

2-        MOVFF SSP1BUF,POSTINCO

3-        Limpiar memoria RAM al iniciar el programa


Alguien tiene alguna idea sobre como hacer eso en c??

Un saludo

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5878
    • Picuino
Re: Equivalencias entre ensamblador y C
« Respuesta #1 en: 26 de Noviembre de 2014, 09:37:42 »
Depende de lo que quieras hacer. No siempre hay una equivalencia exacta.
En general se traduce un conjunto de instrucciones en ensamblador a otro conjunto de instrucciones en C.
Pero no siempre una traducción "literal" es buena. Como en los lenguajes de las personas, la traducción libre es mejor.

La instrucción LFSR no existe en C, hay que implementarla con varias instrucciones.
   1º Leer bit 0
   2º Desplazar variable a la derecha
   3º Copiar bit 0 en el bit 7


La otra, se suele implementar con punteros. Por ejemplo:   *p++ = 5;


Saludos.


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Equivalencias entre ensamblador y C
« Respuesta #2 en: 26 de Noviembre de 2014, 11:53:15 »
Como dijo Picuino lo mas interesante seria hacerlo con punteros. De ahi el compilador se encargara de eso.

1-
La instruccion LFSR hace:

Syntax: LFSR f, k
Operands: 0 < f > 2
0 < k > 4095
Operation: k -> FSRf

Por lo tanto en C si pudieras cargar los valores al registro directamente es otra alternativa:

FSR0H = ((BUFFER_ENT >> 8 ) & 0x0F)
FSR0L = (BUFFER_ENT & 0xFF) // No se si es necesario un cast al tamaño de un byte aunque no creo

Recordando que son 12 bits. Y realmente no se si se pudiera asignar completamente.

Como FSR0 = BUFFER_ENT

Probaste ?

2-

POSTINCO = SSP1BUF

(Pero esto imagino que estara dentro de una rutina de interrupcion o esperaras que exista un dato antes de leerlo)

3-
Aqui depende de vos, no se por que limpiarias la RAM antes... Si es una variable inicializada obviamente tiene un valor (ejemplo int i=0; ), pero sino le deberias asignarle un valor (ejemplo int datos[5]; ), o recorrerlo asignandole un valor de esa forma se encuentra "Limpia", aunque no encuentro un por que leerias antes de escribir en esa posición de memoria.
« Última modificación: 26 de Noviembre de 2014, 12:04:55 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Equivalencias entre ensamblador y C
« Respuesta #3 en: 26 de Noviembre de 2014, 11:58:28 »
...

También he oído que hay una forma de poner instrucciones en ensamblador en el programa en c, cualquiera de las dos opciones me vale en un principio aunque preferiría el equivalente en c.
...

#ASM
....
....
....
#ENDASM
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Equivalencias entre ensamblador y C
« Respuesta #4 en: 26 de Noviembre de 2014, 12:04:05 »
Tambien creo que con asm("LFSR  0,BUFFER_ENT");

Desconectado Salty

  • PIC10
  • *
  • Mensajes: 15
Re: Equivalencias entre ensamblador y C
« Respuesta #5 en: 27 de Noviembre de 2014, 13:06:11 »
Muchas gracias a los tres. ya tengo los tres puntos que mencionaba en c  :mrgreen: la forma de KILLERJC para poner instrucciones en ensamblador funciona. La de elgarbe no compila, no reconoce las expresiones. Gracias por las explicaciones :)

Desconectado Salty

  • PIC10
  • *
  • Mensajes: 15
Re: Equivalencias entre ensamblador y C
« Respuesta #6 en: 10 de Diciembre de 2014, 05:25:46 »
Buenos días!! Me ha surgido una nueva duda. Si quiero seleccionar un determinado banco como puedo hacerlo en c? Es decir, si quiero hacer: BANKSEL PR4 cual seria el equivalente en c?  Gracias de nuevo ;)

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Equivalencias entre ensamblador y C
« Respuesta #7 en: 10 de Diciembre de 2014, 11:53:39 »
Buenos días!! Me ha surgido una nueva duda. Si quiero seleccionar un determinado banco como puedo hacerlo en c? Es decir, si quiero hacer: BANKSEL PR4 cual seria el equivalente en c?  Gracias de nuevo ;)

La memoria es continua, estuve leyendo y dice que solo una instruccion en ASM hace uso de los 12 bits para el direccionamiento que es MOVFF, mientras que las demas hacen uso de 8 bits + 4 dado por el registro BSR.
El BSR se carga con la instruccion en ASM que es MOVLB. El BSR separa la RAM en 16 secciones/bancos de 256 bytes cada uno. Segun la direccion que tengan estos el compilador va a cargar esos 4 bits al BSR.

Pero no se por que te preocuparias de cambiar de banco en C, cuando este deberia hacerlo por si mismo, es decir si esta ocupando un lugar en la memoria que es 0x2A0 , C deberia cargar o cargaria ese 2 en el BSR, esto es para un acceso directo.
Su ASM deberia ser un
MOVLB 0x2
aca instruccion con la direccion A0

Y si fuera indirecto que es lo mas seguro que haga es cargar los 12 bits de la direccion a un FSRx y leer/escribir su INDFx. y se mantiene en el banco 15
LFSR  0,0x2A0
Aca instruccion de lectura/escritura/lo que sea de INDF0

Y probar en C no costaria nada, pero como digo no tiene sentido.

Los SFR ( Registros de funciones especiales) estan ubicados en el banco 15 inclusive el BSR. Por eso existe una instruccion en ASM para cargar el BSR (al menos por eso la nombre ).

Probaste BSR = 0x2;
o algo asi ?.

Muchas gracias a los tres. ya tengo los tres puntos que mencionaba en c  :mrgreen: la forma de KILLERJC para poner instrucciones en ensamblador funciona. La de elgarbe no compila, no reconoce las expresiones. Gracias por las explicaciones :)

Por que creo que la opcion que te dio el es para CCS
« Última modificación: 10 de Diciembre de 2014, 12:46:15 por KILLERJC »


 

anything