Я изучаю ассемблер, и я овладеваю им. Но есть одна вещь, которую я не могу заставить работать.
Для печати информации на дисплее по последовательной шине я сделал функцию печати.
В 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.