编写两(2)个ARM汇编语言子例程,名为output_char和read_char。 这些子程序允许用户输入字符并通过UART在PuTTy中显示字符。 所有用户输入都应回显到显示屏
我尝试编写代码但是没有用。
U0LSR EQU 0x14
register EQU 0xE000C000
STMFD SP!,{lr}
read_character
LDR r0, =0xE000C014
LDRB r1, [r0]
BIC r1, r1, #0xFFFFFFFE
CMP r1, #0
BEQ read_character
LDR r6, =register
LDR r2, [r6]
output_character
LDR r0, =0xE000C014
LDRB r1, [r0]
BIC r1, r1, #0xFFFFFFEF
MOV r1, r1, LSR #1
CMP r1, #0
BEQ output_character
LDR r6, =register
STR r2, [r6]
LDMFD sp!, {lr}
BX lr
答案 0 :(得分:1)
这看起来很相关
http://csserver.evansville.edu/~blandfor/EE311/ARMLecture/UARTNotes.pdf
考虑到这些应该是两个独立的功能,以上的评论适用。此外,我将假设,因为问题不是指初始化UART,否则它确实成功。 STMFD / LDMFD / BX三重应与两个功能相关联。另外,考虑ARM程序调用标准
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf
如果可能的话,你可能应该在程序中将自己限制在R0-R3。如果需要更多,则需要将它们添加到STMFD / LDMFD指令中,这样就不会修改寄存器而不将它们恢复到先前的状态。编写问题语句的方式是,read_char函数需要调用write_char函数来回显键入屏幕的字符。你的答案中缺少这个。看起来持有字符的寄存器与发送字符的寄存器相同,所以这很好。否则read_character函数看起来没问题。
你的write_character函数看起来不太正确,但是你的BIC 0xFFFF FFEF看起来不正确。你想看看Transmitter Empty位,你应该使用0xFFFF FFBF。作为一种风格,我建议使用AND与你想要的位设置与BIC和逆。让它更容易看到。如果您没有在输出上看到任何内容,这很可能是问题,因为LSR [4]处的BI(中断指示符)位可能永远不会变高,因此您的代码将永远循环。
最后,问题语句说使用read_char和output_char作为函数名,因此需要将这些标签添加到STMFD指令中。您的BEQ很好,它需要循环回从线路状态寄存器读取的寄存器,因此它需要一个单独的目标标签。