我正在学习汇编,并且掌握其中的窍门。但是有一件事情我无法上班。
为了通过串行总线在显示器上打印信息,我进行了打印。
在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
我想创建一个本地字符串变量,使用r6和r7设置x和y,然后打印该本地字符串变量。 chrout功能不是我的,并且可以正常工作。它将A的内容放入Tx缓冲区,如果缓冲区为空,则设置发送标志。
我对变量的范围还不够了解,无法理解为什么它不起作用。我还试图在存储所有其他变量的地方声明该字符串,但这也不起作用。
如何使它正常工作?
也:由于ram受限制,该字符串将被放入xdata存储器中。但是我更喜欢使用代码存储。可以用相对简单的方式做到吗?
其他信息:我正在编写8051软核,并且正在使用AVOCET A51汇编程序。
答案 0 :(得分:0)
解决方案是在打印功能中使用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