String ARM汇编字符串读取和输出子例程

String ARM汇编字符串读取和输出子例程,string,assembly,input,arm,output,String,Assembly,Input,Arm,Output,所以我创建了两个子例程,分别称为read_character和output_character,它基本上通过uART输出您在PuTTy屏幕上键入的任何内容。这两个子例程持续循环,在屏幕上显示您键入的任何内容。基本上是输入和输出 我需要帮助创建另外两个名为read_string和output_string的子例程,它们将利用上述两个函数(read_character和output_character)在用户键入字符串后显示字符串。正如在中一样,一旦用户键入字符串并点击ENTER键,我的显示器就会将

所以我创建了两个子例程,分别称为read_character和output_character,它基本上通过uART输出您在PuTTy屏幕上键入的任何内容。这两个子例程持续循环,在屏幕上显示您键入的任何内容。基本上是输入和输出

我需要帮助创建另外两个名为read_string和output_string的子例程,它们将利用上述两个函数(read_character和output_character)在用户键入字符串后显示字符串。正如在中一样,一旦用户键入字符串并点击ENTER键,我的显示器就会将字符串返回给用户

以下是我创建的子程序:

U0LSR EQU 0x14          ; UART0 Line Status Register
register EQU 0xE000C000

read_character
        LDR r0, =0xE000C014                            ;load the flag register to r0
        LDRB r1, [r0]                                  ;load byte from r0 to r1
        BIC r1, r1, #0xFFFFFFFE                        ; bit clear and keep the first bit to check RDR
        CMP r1, #0                                     ;compare to 0
        BEQ read_character                             ;if 0 go back to read_character
        LDR r6, =register                              ;if not 0, then continue and save what is in 0xE000C000 in r6
        LDR r2, [r6]

        ;if 1 => read the byte from recieve register
        ;stop

    output_character
        LDR r0, =0xE000C014                             ;load the flag register to r0
        LDRB r1, [r0]                                   ;load the byte
        BIC r1, r1, #0xFFFFFFDF                         ;bit clear and keep the 5th bit, which is the THRE bit
        MOV r1, r1, LSR #4                              ;right shift to set the fifth bit as first
        CMP r1, #0                                      ;compare to 0
        BEQ output_character
        LDR r6, =register
        STR r2, [r6]
        B read_character                                 ;branch back to read_character to read and transmit next character

        LDMFD sp!, {lr}
        BX lr

我猜您当前的程序是一个简单的无限循环,只需获取输入字符并将其放置在UART的输出FIFO上

你想用你的新程序做什么需要做几件事

读取字符
需要循环自身,直到检测到ENTER。查看ASCII表格了解ENTER的编码方式

此外,
read\u character
现在必须将其数据存储在某个位置,直到按下ENTER键。 一种可能的方法是写入特定的内存位置,每次写入递增。如何选择这样的内存位置?该位置的要求是什么

但是,您现在需要一种与
output\u character
通信的方法,可以是字符列表的末尾,也可以是接收到的字符数

  • 字符列表的末尾—想想C是如何做到这一点的(或者查找它)。您的程序需要执行什么操作才能遵循此方法
  • 接收的字符数-您还可以如何使用此数字?它不仅仅是一个你已经收到多少的计数,它还可以表示一个指向当前空字节的指针偏移量。如何在你的程序中使用它
您应该在何时中断循环并继续
输出\u字符
?那会有什么副作用

output_character
需要修改,以便从草稿行位置读取一个字符并前进一个字节,直到它到达列表末尾,或者您发送的字符数等于您收到的计数。你怎么能轻易做到?查看ARM寻址模式以获取提示


循环回到
读取字符
,什么值需要重置,为什么要重置?

我知道它背后的想法。我无法用文字或语法表达出来,所以请你帮我解决一下。可能重复的否定在那个问题上,我问了另一件事。这里我问的是另一件事。
LDMFD sp!,{lr}
BX-lr
do?你的代码永远不会到达那些地方。你没有任何子例程。您有两段代码。一个人读一个字符,另一个人写它。
B read_字符
在两个代码段上进行无限循环。如果你真的有函数,回答你的问题会更容易。也许在你问这个问题之前,应该有一个标志,你需要正确回答另一个问题?
B read_字符
是唯一的区别。这一行没有函数或子例程。这是你问过的问题,我真的很难理解什么是不同的和/或任何人如何能给出比其他两个问题更好的答案。