Signo de libra con DPTR 8051

1

Estoy aprendiendo programación con 8051 y 2051 usando lenguaje ensamblador. Sobre el signo de libra (#) encontré que debería usarse cuando estoy considerando datos inmediatos. Como he encontrado aquí enlace

MOV A,#23H ;load 23H into A (A=23H)
MOV RO,#12H ;load 12H into RO (RO=12H)
MOV R1,#1FH ;load 1FH into Rl (R1=1FH)

Pero al usar el modo de direccionamiento indexado, encontré que tengo que usar el signo # para indicar la dirección. Y no lo encontré por ningún lado. Este es un programa simple que escribí -

ORG 00h
MOV A, #00h
MOV DPTR, #Y
MOVC A, @A+DPTR

MOV A, #00h
MOV DPTR, #Z
MOVC A, @A+DPTR

ADD A, R1
MOV P1, A

Here: sjmp HERE

X: db 00h
Y: db 100
Z: db 50 
END

¿Hay alguna otra manera de obtener valor de una variable que está en la memoria de código? ¿Y está considerando DPTR #Z como la dirección de Z? ¿No debería obtener datos en lugar de direcciones?

Busqué esa cosa de signo de libra pero parece que estoy encontrando en el lugar equivocado. Gracias por ayudarme a entender de antemano.

    
pregunta Shimul Chowdhury

1 respuesta

2

En lenguaje ensamblador, el término addressing mode no significa tomar la dirección de una variable; sino más bien cómo se codifica la información en el código de instrucción. Por ejemplo, el código de instrucción 0xE8 0x4D es la instrucción mov A,0x4D que usa el modo de direccionamiento directo: acc A obtiene el contenido de la dirección iram 0x4D. Pero el código de instrucción 0x74 0x4D es mov A,#0x4D : acc A obtiene el valor literal real 0x4D. Ambas instrucciones tienen la misma longitud y utilizan una codificación similar, pero el significado de 0x4D depende del modo de direccionamiento que se usó.

Incluso si define un símbolo LetterM equ 0x4D , esto no hace ninguna diferencia en los ensamblajes 8051 - mov A,LetterM como 0xE8 0x4D y mov A,#LetterM ensambla como 0x74 0x4D. El 8051 en sí nunca ve el código fuente del ensamblaje, solo el código objeto. Por lo tanto, la única razón por la que la puntuación como # o @ es importante es garantizar que el ensamblador utilice el modo de direccionamiento correcto para codificar cada instrucción.

Para cargar el registro de puntero de datos de 16 bits, mov dptr,#data16 solo admite immediate addressing mode . Por lo general, desea usar dptr para apuntar a la dirección de memoria de un objeto, de modo que el modo de direccionamiento inmediato es lo que necesita. Para su pregunta, mov dptr,#Z considera que mov dptr,#data16 es el modo de direccionamiento inmediato y Z como la dirección del símbolo Z, que está utilizando para almacenar una variable.

Si ya entiende los punteros del lenguaje C, el registro dptr es un puntero a un valor de 8 bits en la memoria, y la instrucción movc A, @A+DPTR es lo que quita el valor del puntero que está en el registro dptr. Entonces, dptr siempre obtiene la dirección donde vive la variable, y el modo de direccionamiento indirecto (@) usa el valor actualmente en dptr para obtener el valor al que apunta dptr.

// some C pseudocode to help explain 8051
uint8* dptr_register;      // 8051 built-in DPTR register
uint8 acc_a;               // 8051 built-in accumulator register A
static uint8 myVarZ = 123; // myVarZ: db 123
dptr_register = &myVarZ;   // mov dptr,#myVarZ ; address of myVarZ
acc_a = *dptr_register;    // movc A,@A+DPTR  (assuming A is 0) ; get value of myVarZ

Sin embargo, el 8051 es un poco más complicado porque tiene más de un espacio de direcciones. La dirección de código 0 es diferente de la dirección de RAM interna 0, que también es diferente de la dirección de RAM externa 0. Por eso hay varias instrucciones diferentes que usan dptr ('movc', 'mov', 'movx'). Los compiladores de C real para 8051 (como Keil C51 o SDCC) tienen algunas palabras clave adicionales no estándar para distinguir entre estos diferentes espacios de direcciones.

Otros microcontroladores tienen conjuntos de instrucciones ligeramente diferentes y usan puntuaciones ligeramente diferentes, pero todos son lo suficientemente similares a uno que aprendes uno, puedes recoger fácilmente los otros.

    
respondido por el MarkU

Lea otras preguntas en las etiquetas