在Assembly中为打印功能制作并访问本地变量

时间:2019-03-18 08:30:35

标签: assembly local-variables 8051

我正在学习汇编,并且掌握其中的窍门。但是有一件事情我无法上班。

为了通过串行总线在显示器上打印信息,我进行了打印。

在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汇编程序。

1 个答案:

答案 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