Autor Tema: llamar funcion desde c a ensamblador con dos parametros  (Leído 3874 veces)

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

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
llamar funcion desde c a ensamblador con dos parametros
« en: 29 de Enero de 2015, 13:05:03 »
Antes de nada decir que he buscado esto por el foro antes de hacer un nuevo post pero no he encontrado nada, disculparme en el caso de que este ya posteado.

Estoy programando un PIC16f877a con programacion mixta C y ensamblador en xc8 y me ha surgido la siguiente duda y necesidad:
¿como puedo llamar a una funcion en ensamblador desde C, pero pasando dos parametros, por ejemplo: DescodificaDigito(1, minutos1+48); tengo esta funcion escrita en C y me gustaría reescribirla en ensamblador,
es facil mandar un solo parametro con el acumulador W pero como paso dos parametros?

muchas gracias a todos.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: llamar funcion desde c a ensamblador con dos parametros
« Respuesta #1 en: 29 de Enero de 2015, 13:28:03 »
Tomado de "MPLAB® XC8 C Compiler User’s Guide" Seccion 5.8.6


Citar
Take, for example, the following ANSI-style function.

void test(char a, int b);

The function test() will receive the parameter b in its function auto-parameter block and a in the W register. A call to this function:

test(xyz, 8 );

would generate code similar to:

MOVLW 08h ; move literal 0x8 into...
MOVWF ?_test ; the auto-parameter memory
CLRF ?_test+1 ; locations for the 16-bit parameter
MOVF _xyz,w ; move xyz into the W register
CALL (_test)

In this example, the parameter b is held in the memory locations ?_test (LSB) and ?_test+1 (MSB).

Tambien para retornar valores:
(No usa W)

Citar
For example, the function:

int return_16(void)
{
 return 0x1234;
}

will exit with the code similar to:

MOVLW 34h
MOVWF (?_return_16)
MOVLW 12h
MOVWF (?_return_16)+1
RETURN

En el primer ejemplo observas que xyz se pasa por W y el otro por un stack, que en ese caso son 2 por ser un int ( en el supuesto que int sea de 16bits )

Asi que imagino que sera asi para el segundo parametro (si es de un byte, todo depende de tu variable "minutos1" como esta definida):
?_DescodificaDigito

En el unico micro que vi hacer esto es con los ARM que utiliza 3 registros y lo demas en la pila. Pero en ese PIC la pila no es accesible y solo se se podria usar los registros de la RAM.

Y terminando el tema, si no te anda eso proba con: DescodificaDigito@nombreVariable
« Última modificación: 29 de Enero de 2015, 13:58:39 por KILLERJC »

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: llamar funcion desde c a ensamblador con dos parametros
« Respuesta #2 en: 29 de Enero de 2015, 14:13:52 »
gracias por responder KILLERJC

ya habia probado ese ejemplo pero creo que no estoy definiendo la función en ensamblador o algo, ya que me ofrece este error

src/ASM.asm:258: error: (800) undefined symbol "?_DescodificaDigito"

por lo que me comentas del segundo ejemplo de DescodificaDigito@nombreVariable eso no lo he visto nunca podrias aclararmelo un poco, en ensamblador estoy bastante corto aun

un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: llamar funcion desde c a ensamblador con dos parametros
« Respuesta #3 en: 29 de Enero de 2015, 15:01:37 »
tambien aprovecho para preguntar, si alguno sabe como acceder a un vector declarado en c

por ejemplo unsigned char prueba[3];


en ensamblador como podriamos acceder a cada uno de lo bytes de ese vector?
supongo que primero debemos declararla

GLOBAL _prueba

pero luego las cosas que pruebo no terminan de funcionar, como puedo entrar en las direcciones de memoria? por ejemplo en motorola 68000 bastaba con poner el nombre para acceder a la direccion de memoria o (nombre) para aceder a la memoria.

muchas gracias y un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2979
Re: llamar funcion desde c a ensamblador con dos parametros
« Respuesta #4 en: 29 de Enero de 2015, 16:10:54 »
de acuerdo, ya se por que no me funciona, por lo visto la funcion de mandar mas de un parametro desde ensamblador a c o viceversa, no se puede realizar en el modo FREE del compilador,:


:: warning: (1273) Omniscient Code Generation not available in Free mode
:0: error: (499) undefined symbol:

por lo tanto pondré el segundo parámetro de la función como global, y ya esta. ¿quizas alguien pueda ayudarme con el problema de vectores en ensamblador muchas gracias y un saludo
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: llamar funcion desde c a ensamblador con dos parametros
« Respuesta #5 en: 29 de Enero de 2015, 23:28:10 »
No se exactamente como funciona ya que el unico que vi de como hacer esto fue con un micro ARM.

Y lo unico que tengo entendido era que el primer parametro se pasaba por W y lo demas por el "stack". El cual al stack ese lo pense como algo abstracto, es decir sin importancia para mi ya que luego el compilador+linker sabria de que se trata

Con respecto al vector como esta construido el PIC se grabaria en registros del mismo, asi que deberia haber una valor que retorne la direccion.

En fin deberia ponerme a probar en mplab x, al igual que vos.


 

anything