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