【问题标题】:ARM Assembly String read and output subroutineARM 汇编字符串读取和输出子例程
【发布时间】:2014-02-28 02:58:36
【问题描述】:

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

【问题讨论】:

  • 我知道它背后的想法是什么。我无法用文字或语法表达,所以请你帮帮我。
  • 不,在那个问题中我问了另一件事。在这里我问的是不同的事情。
  • LDMFD sp!, {lr}BX lr 有什么作用?您的代码永远不会到达那些。您没有任何子例程。你有两段代码。一个人读一个字符,另一个人写它。 B read_character 在两个代码段上进行无限循环。如果你真的有功能,回答你的问题会更容易。也许应该有一个标志,在你问这个问题之前你需要得到另一个问题? B read_character 是唯一的区别。此行不构成函数子例程
  • 这是您所问的yet another question,我真的很难理解有什么不同和/或如何谁能给出比其他两个问题更好的答案。

标签: string assembly input arm output


【解决方案1】:

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

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

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

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

但是,您现在需要一种方法来与output_character 交流字符列表的结尾或收到的字符数。

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

你应该什么时候跳出循环并继续output_character?会有什么副作用?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多