Создание и доступ к локальной переменной в сборке для функции печати

Я изучаю ассемблер, и я получаю повесить его. Но есть одна вещь, которую я не могу заставить работать.

Чтобы распечатать информацию на дисплее по последовательной шине, я сделал функцию печати.

На C я написал свою собственную функцию печати, которая называлась как print("hello world");. Функция печати представляла собой простой цикл while, который использовал указатель для установки байтов в буфере Tx. uController использовал память кода для строки, а не память xdata И память кода.

В сборке сейчас пытаюсь сделать что-то подобное. Я считаю, что моя функция печати работает правильно (так ли это?). Я считаю, что проблема заключается в переменной, ее области действия и месте, где я объявляю/инициализирую строку.

В сочетании с функцией печати я использую функцию установки позиции, которая использует r6 и r7 и специальный байт инструкции для установки позиции записи для дисплея.

setposa  mov   a,#setapos     ;set position x-y
         lcall chrout
         mov   a,r6         ;x position
         lcall chrout
         mov   a,r7         ;y position
         lcall chrout
         ret 



print       lcall setposa   
print1      movx a, @dptr   ; put the character in a (used by chrout)
            jz print2       ; if charac is not /0, print it else jump to end
            lcall chrout
            inc dptr
            jmp print1
print2      ret 

Я вызываю функцию печати с помощью следующих строк:

;tab_bas   db 'this is a string',0  ; SHOULD NOT BE HERE?, DOES NOT WORK!! send tons of data to display resulting in a crash  I believe this line of code never runs  
s08p44    clr stepkey           ; clear this bit for re-use
tab_bas   db 'this is a string',0   ;having it here seems not to do anything, nothing happens   
          mov r6,#5
          mov r7,#6             ; set position for the text
          mov dptr, #tab_bas    ; set datapointer at text to print
          call print            ; print the text at desired position
          jmp s08p38            ; jump to ret instruction

Я хочу создать локальную строковую переменную, установить x и y с помощью r6 и r7, а затем распечатать локальную строковую переменную. Функция chrout не моя, и доказано, что она работает. Он помещает содержимое A в буфер Tx и устанавливает флаг передачи, если буфер пуст.

Я еще недостаточно хорошо понимаю область действия переменных, чтобы понять, почему это не работает. Я также пытался объявить строку в месте, где хранятся все остальные переменные, но это тоже не работает.

Как я могу заставить это работать?

Также: строка должна быть помещена в память xdata, так как оперативная память ограничена. Но я бы предпочел использовать память кода. Можно ли это сделать относительно простым способом?

Дополнительная информация: Я программирую софткор 8051 и использую ассемблер AVOCET A51.


person bask185    schedule 18.03.2019    source источник


Ответы (1)


Решение заключалось в использовании инструкции movc вместо movx внутри функции печати, чтобы правильно позволить указателю данных указывать на таблицу (одна строка)

print       lcall setposa
print1      clr a
            movc a,@ a + dptr       ; set datapointer at text to print
            jz print2       ; if charac is not /0, print it else jump to end
            lcall chrout
            inc dptr
            jmp print1
print2      ret
person bask185    schedule 19.03.2019