en el ensamblador dsPIC33, ¿puedo usar todos los registros w?

1

La mayor parte de mi aplicación dsPIC3 está escrita en C, pero una función es particularmente sensible a la velocidad, por lo que tuve que escribir esa función en el ensamblador. La función se parece aproximadamente a esto:

_FunctionName:
lnk #0x0
push w0 .. w15

< code that uses all registers >

pop w15 .. w0

ulnk
return

¿Es esta una mala idea? ¿O el uso de algunos registros me causará problemas, incluso si los he puesto en la pila?

    
pregunta Rocketmagnet

2 respuestas

3

El compilador C30 espera que una subrutina conserve W8-W15, pero puede eliminar W0-W7. Por lo tanto, solo necesita guardar / restaurar W8-W14 si va a utilizarlos. De lo contrario, si puede arreglárselas con W0-W7 para cero, entonces no hay necesidad de guardar / restaurar nada.

Tenga en cuenta que nunca ha empujado / pop explícitamente W15 ya que ese es el puntero de pila. La forma de guardarlo / restaurarlo es sacar la misma cantidad de cosas de la pila que empuja sobre ella, incluida la dirección de retorno de subrutina que generalmente se extrae al ejecutar RETURN.

Configuré el modo C30 para que no use marcos de pila. Los marcos de apilamiento pueden ocasionalmente ser una ayuda para la depuración, pero de lo contrario son solo un desperdicio de espacio y ciclos. Hay una opción de línea de comando para el compilador C30 que le impide usar marcos de pila, y por lo tanto no emite las secuencias de enlace / desvinculación tontas. Hasta ahora siempre he usado eso y no he tenido problemas.

Otro problema con su código anterior es que olvidó declarar _FunctionName global.

    
respondido por el Olin Lathrop
1

Llamar a rutinas de ensamblador desde programas C está cubierto en el Capítulo 9 de la Guía del usuario del compilador. Hay mucho que hacer y necesitas leerlo a fondo. W8-W15 se guardan de todos modos, en una llamada de función, y W0-W7 se puede utilizar como registros de memoria virtual.

    
respondido por el Leon Heller

Lea otras preguntas en las etiquetas