mpasm - variables superpuestas en una directiva udata

1

En MPASM parece que puedo hacer esto para que paylen_lo y bytesleft tengan la misma ubicación de memoria:

            UDATA
paylen_hi   RES     1
bytesleft   RES     0
paylen_lo   RES     1

Esto utiliza el mismo tipo de truco que con CBLOCK donde 0 bytes se reservan para una ubicación, lo que hace que dos etiquetas estén en la misma ubicación.

MPASM advierte con "Advertencia [231] Esta instrucción no ha reservado ninguna memoria", pero el archivo del mapa muestra la ubicación que se comparte correctamente.

Mi problema es que esto no parece estar documentado y, por lo tanto, me preocupa que sea un truco. Las alternativas que he probado son:

bytesleft  EQU  paylen_lo
           #define bytesleft paylen_lo

El primero no funciona y el segundo está bien. ¿Los desarrolladores de PIC más experimentados se quedan con lo definido? La única ventaja del truco anterior es que se crea el símbolo.

    
pregunta carveone

1 respuesta

1

He usado el primer método varias veces, aunque dos nombres para el mismo byte son algo que se debe evitar a menos que realmente haya alguna ventaja.

Desafortunadamente, MPASM lanza advertencias para algunas cosas perfectamente normales y útiles. Puede desactivar selectivamente las advertencias molestas por el número de advertencia. Supongo que debo haberlo hecho hace mucho tiempo en mi código de configuración ya que no recibo esa advertencia.

No me gusta usar #define porque, al igual que en C, es solo una sustitución de cadena. El ensamblador reemplaza una cadena por otra y no sabe nada más que eso. El primer método es mejor ya que el ensamblador entiende que el símbolo es la dirección de una variable.

Otro problema con su código es que está utilizando un orden de bytes inusual. En una máquina de 8 bits, el orden de bytes de las variables muli-byte depende de usted. Sin embargo, hay algunos casos en los que los valores de datos nativos son más grandes que 8 bits, y el hardware del PIC asume que se almacenan en el orden de byte más significativo al menos significativo. Así es como también se escriben las bibliotecas. Debe usar el primer orden de bytes bajos a menos que haya una razón específica y especial para no hacerlo. Por ejemplo, he almacenado las direcciones IP en orden de bytes alto a bajo porque así es como se envían y reciben en el protocolo IP. Pero en todos estos casos debe haber un comentario que marque el hecho de que el orden de bytes es opuesto al orden estándar esperado.

También creo que nombrar cada byte de una variable de múltiples bytes agrega más confusión debido al desorden de lo que los nombres adicionales podrían ayudar. Por ejemplo, defino variables de múltiples bytes como esta:

myvar    res     4           ;32 bit integer

En ese caso, me refiero a hacer siempre referencia a bytes individuales utilizando el nombre de la variable más el desplazamiento explícito del byte, incluso cuando ese desplazamiento del byte es 0. Por ejemplo:

;   Increment MYVAR by one.
;
         banksel myvar
         incf    myvar+0     ;increment the low byte
         movlw   0
         addwfc  myvar+1     ;propagate carry to higher bytes
         addwfc  myvar+2
         addwfc  myvar+3

La sintaxis "+ n" alerta a los lectores sobre el hecho de que se trata de una variable de múltiples bytes, y luego a qué byte se accede.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas