String ARM汇编字符串读取和输出子例程
所以我创建了两个子例程,分别称为read_character和output_character,它基本上通过uART输出您在PuTTy屏幕上键入的任何内容。这两个子例程持续循环,在屏幕上显示您键入的任何内容。基本上是输入和输出 我需要帮助创建另外两个名为read_string和output_string的子例程,它们将利用上述两个函数(read_character和output_character)在用户键入字符串后显示字符串。正如在中一样,一旦用户键入字符串并点击ENTER键,我的显示器就会将字符串返回给用户 以下是我创建的子程序: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键,我的显示器就会将
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_字符
是唯一的区别。这一行没有函数或子例程。这是你问过的问题,我真的很难理解什么是不同的和/或任何人如何能给出比其他两个问题更好的答案。