ARM Assembly String读取和输出子例程

时间:2014-02-28 02:58:36

标签: string assembly input arm output

所以我创建了两个名为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

1 个答案:

答案 0 :(得分:0)

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

您想要对新程序做什么需要做几件事。

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

此外,read_character现在必须将其数据存储在某处,直到按下ENTER键。 一种可能的方法是写入特定的内存位置,递增每次写入。你如何选择这样的记忆位置?该位置有哪些要求?

但是,您现在需要一种方法来与output_character进行通信,无论是字符列表的结尾还是您收到的字符数。

  • 字符列表的结尾 - 想想C是如何做到的(或查找它)。您的程序需要做什么才能遵循此方法?
  • 收到多少个字符的数量 - 你还能用这个号码吗?它不仅仅是您收到的数量的计数,它还可以表示指向当前空字节的指针。怎么能在你的程序中使用它?

什么时候应该突破循环并继续output_character?会有什么副作用?

需要修改

output_character以从便笺簿位置读取一个字符并前进一个字节,直到它到达列表末尾,或者您发送的字符数等于您收到的数量。你怎么能轻易做到这一点?查看提示的ARM寻址模式。

循环回read_character,需要重置哪些值,为什么?