Variable de acceso que se encuentra en el espacio de código en el ensamblador

0

Keil's C51 permite compartir variables globales entre C y el código del ensamblador . Sin embargo, necesito almacenar una variable en el espacio de código de un microcontrolador 8051. Sin embargo, cuando intento acceder a la variable en el ensamblador obtengo algunos errores.

Tengo la siguiente declaración en mi archivo fuente c:

unsigned char code STATE = 0xFF;

Y en mi archivo de encabezado se ve así:

extern unsigned char code STATE; 

Con el compilador Keils C51 es posible acceder a las variables globales en C utilizando la palabra clave EXTERN en su código de ensamblaje, así que en mi ensamblaje tengo:

EXTERN CODE (STATE)

Sin embargo, cuando intento acceder a la variable en mi ensamblaje, aparece el error: DATA-ADDRESS ESPERADOS :

 MOV     A, STATE ; Move state to A;

También como está en el espacio de código, debería acceder usando una instrucción MOVC, así debería funcionar:

 MOVC     A, STATE ; Move state to A;

Sin embargo, esto produce un error de TIPO DE EXPRESIÓN NO COMPATIBLE ( error AX51 A22 ).

Entonces, ¿cómo puedo acceder a esta variable en el ensamblador?

    
pregunta Dean

2 respuestas

2

Solo puede acceder a la sección CÓDIGO a través del registro DPTR. En el manual de AX51 :

  

Se puede acceder a la memoria CODE con la instrucción MOVC a través del registro DPTR.

     

Ejemplo para todas las variantes del 8051:

?CO?my_seg SEGMENT CODE                ; define a SEGMENT of class CODE
       RSEG    ?CO?my_seg
TABLE:     DB      1,2,4,8,0x10        ; a table with constant values

?PR?myprog SEGMENT CODE                ; define a segment for program code
       RSEG    ?PR?myprog
       MOV     DPTR,#TABLE         ; load address of table
       MOV     A,#3                ; load offset into table
       MOVC    A,@A+DPTR           ; access via MOVC instruction

Entonces sería un caso de cargar el registro DPTR con la dirección de su variable externa y usar un desplazamiento de 0:

MOV     DPTR, #STATE
MOV     A, #0

luego acceda a esa dirección usando DPTR:

MOVC    A,@A+DPTR
    
respondido por el Majenko
0

¡Además, una variable en el espacio de código no es una variable sino una constante! La sintaxis sugiere que al utilizar el acumulador como un desplazamiento de la dirección en el registro de puntero de datos.

    
respondido por el user34920

Lea otras preguntas en las etiquetas