基于内存映射的MIPS汇编按键LED控制代码正确性验证
系统硬件信息
- 4个按键A至D,内存映射地址:
0xffffe440 - 按键状态对应位索引7至4:A对应位7,D对应位4,位值1表示按键按下
- 8个LED灯,内存映射地址:
0x17880010 - LED对应位索引12至5
需求说明
编写无限循环程序,逻辑如下:
- 读取按键A和D状态
- 若A被按下:LED显示十进制13的二进制表示(13的二进制为
1101,左移5位对应LED位5-8,即0x1A0) - A松开后:保持显示13直到D被按下
- D被按下:所有LED熄灭
- 再次按下A:重新显示13
- A和D同时按下:LED熄灭
- 程序启动且无按键按下:LED全灭
我的尝试
我写了如下代码,想确认逻辑是否正确:
funct : lui $t0, 0xffff ori $t0, $t0, 0xe440 lui $t1, 0x1788 ori $t1, $t1, 0x0010 loop : lw $t2, 0($t0) andi $t3, $t2, 0x90 addi $t4, $0, 0x90 bne $t3, $t4, check_A andi $t9, $t9, 0x0 sw $t9, 0($t1) j loop check_A : andi $t3, $t2, 0x80 addi $t4, $0, 0x80 bne $t3, $t4, check_D andi $t9, $t9, 0x1a0 sw $t9, 0($t1) j loop check_D: addi $t4, $0, 0x10 andi $t4, $0, 0x10 bne $s3, $t4, exit andi $t9, $t9, 0x0 sw $t9, 0 ($t1) j loop exit: j loop
代码问题分析
你的代码存在几个关键错误,无法满足需求:
- 缺少状态记录逻辑:需求要求A松开后保持显示13直到D按下,但代码没有用寄存器记录“是否需要保持显示13”的状态。当前逻辑只有A按下时才设置LED为0x1A0,A松开后不再写LED,无法持续维持显示状态。
- check_D分支变量错误:
bne $s3, $t4, exit中的$s3从未被赋值,应该改为先执行andi $t3, $t2, 0x10读取当前D键状态,再用$t3和$t4比较。 - 冗余代码:
check_D中的andi $t4, $0, 0x10完全多余,前面已经用addi $t4, $0, 0x10将$t4设为0x10,重复操作无意义。 - 初始状态未处理:程序启动时
$t9的值未初始化,也没有主动将LED设为全灭,无法满足“启动无按键时LED全灭”的要求。 - A松开后逻辑缺失:当A松开且D未按下时,代码直接跳回loop,没有对LED执行任何写操作,无法维持显示13的状态。
内容的提问来源于stack exchange,提问作者Need_MathHelp
相关产品推荐
相关产品推荐

