Создать и получить доступ к локальной переменной в ассемблере для функции печати - PullRequest
0 голосов
/ 18 марта 2019

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

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

В C я написал свою собственную функцию печати, которая называлась как print("hello world"); Функция print была простым циклом 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, поскольку ram ограничен. Но я бы предпочел использовать память кода. Можно ли сделать это относительно простым способом?

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

1 Ответ

1 голос
/ 19 марта 2019

Решением было использование инструкции 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
...