Creando un archivo ASM que devolverá los caracteres ubicados en 8 registros consecutivos

2

Tengo que crear un archivo ASM para el PIC18F452 que hace lo siguiente:

(a) define la etiqueta MapName como el primero de los 8 registros consecutivos que contienen una cadena terminada en nulo de no más de 7 caracteres. (b) acceder a una variable entera sin signo de 8 bits llamada MapIndex que se declaró en un archivo C. (c) defina una función ASM getMapChar que se puede llamar desde C usando la función prototype char getMapChar (void) . La función debe devolver el carácter apropiado cuando el valor de MapIndex es < = 7 o el valor 255 si MapIndex es > 7. (d) haga que las etiquetas MapName y getMapChar sean accesibles a un archivo C externo.

Mi código hasta ahora se muestra a continuación:

; Configuration word : WDT off, power-up timer on, code protect off, RC oscillator
list = p18f452
            MapName         equ             0x20
            MapName1        equ             0x21
            MapName2        equ             0x22
            MapName3        equ             0x23
            MapName4        equ             0x24
            MapName5        equ             0x25
            MapName6        equ             0x26
            MapName7        equ             0x27
            CurrentChar     equ             0x28

extern      MapIndex
                            org             0x00
                            goto            getMapChar

getMapChar                  movlw           0x00
                            movwf           MapName7

GLOBAL      getMapChar
GLOBAL      MapName

END

Ya he hecho las partes (a), (b) y (d) pero tengo algunos problemas para escribir el código que se mueve a través de cada uno de los registros consecutivos automáticamente utilizando el valor de MapIndex. ¿Podría alguien ayudarme por favor? Sería muy apreciado.

    
pregunta D Brown

2 respuestas

1

Retrocede y piensa en todo el problema. No, no has hecho A, B y D todavía. Hay tantas cosas mal aquí que demuestran un malentendido tan importante que no sé cómo comenzar a explicar. Todo lo que puedo hacer es enumerar algunos problemas:

  1. No has definido ninguna variable en absoluto. Todo lo que hace EQU es crear un símbolo de un valor particular. No tiene nada que ver con asignar variables. Sólo la directiva RES hace eso.

  2. Parece que estás escribiendo esto en modo absoluto. No dijiste qué compilador estás usando, pero lo más probable es que solo funcione en modo reubicable.

  3. No necesita una etiqueta para cada byte en el búfer. Los nombres de MapNamex son un desorden que da la impresión de que estos nombres se utilizarán por separado. En realidad, nunca los usarás porque estarás indexando en el búfer en tiempo de ejecución.

  4. Este código está escrito como si fuera el único módulo independiente de un proyecto. Claramente, esto no puede ser si hay al menos una rutina de C en el proyecto.

  5. La biblioteca en tiempo de ejecución de C debe inicializarse al inicio, pero está evitando eso al intentar poseer el vector de reinicio.

  6. Está ejecutando su rutina directamente desde el vector de reinicio. Eso no tiene sentido ya que está destinado a ser llamado desde C. Debe crear una subrutina .

  7. No hay lugar para que el código siga dos instrucciones después de getMapChar. Su código acaba de finalizar, por lo que la máquina ejecutará todo lo que esté en la memoria después de la última instrucción en este módulo. Eso no tiene sentido.

Debe retroceder e intentar comprender cómo se ejecuta el código compilado en la máquina, cuáles son las convenciones de vinculación de subrutinas y cómo implementarlas en el ensamblador para crear una función C que devuelva un byte. Intente comprender el papel del compilador, el ensamblador y el enlazador y cómo interactúan. Todavía no estás listo para este problema.

    
respondido por el Olin Lathrop
1

Estás usando el PIC18F - ¡excelente! Corrige muchas de las peculiaridades de la PC16F anterior. Por desgracia, todavía tiene algunas peculiaridades que hacen tropezar a las personas acostumbradas a otros procesadores. Estoy bastante seguro de que varias de las siguientes páginas tratan sobre la versión en lenguaje ensamblador PIC de asignar una matriz en la RAM e indexar el registro FSR a través de esa matriz:

Lista de verificación de principiantes de PicList enlace

Mover bloques de datos enlace

"Programación en lenguaje ensamblador PIC18" enlace

Métodos de memoria del microcontrolador PIC: tablas enlace

PIC - Salida de cadenas múltiples usando la búsqueda de tablas enlace

    
respondido por el davidcary

Lea otras preguntas en las etiquetas