Contenido>Indice>Intro CursoC51

ACCESO A R0 etc. DIRECTAMENTE DESDE C51

Un usuario de C51 siguió utilizando rutinas existentes en ensamblador para realizar tareas específicas. Por razones históricas las rutinas en ensamblador retornaban valores de 8 bits en el registro R0 del banco 3. Sin embargo C51 retorna valores char en R7, por ello la asignación a una variable del valor devuelto por la llamada a una función en ensamblador no funcionaría.

La solución consistió en declarar un puntero específico al área de memoria DATA. En tiempo de ejecución se asignó al puntero la dirección absoluta del registro (0x18). El valor de retorno de la función en ensamblador se recogió mediante este puntero.

/*** Ejemplo de acceso a registros específicos en C ***/
char data *dptr ;  /* Crear un puntero a DATA */

/* Definir la dirección del registro */

#define R0_bank3 0x40018L   /* Dirección de R0 en */
                            /* banco 3, 4 => espacio DATA */
char x,y ;

/* Ejecución */

main() {
dptr = (char*) R0_bank3 ;  /* Apunta a R0, banco3 */

x = 10 ; 
dptr[0] = x ;   /* Escribe x en R0, banco3 */
y = *dptr ;     /* Lee el valor de R0, banco3 */

}

 

Otra alternativa podría consistir en declarar una variable para almacenar el valor de retorno, en un modulo separado y utilizar el linker para ajustar ese módulo a la dirección 0x18 del segmento DATA. Este método es más robusto y eficiente, pero considerablemente menos flexible.


   Contenido>Indice>Intro CursoC51