You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于内存映射的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

代码问题分析

你的代码存在几个关键错误,无法满足需求:

  1. 缺少状态记录逻辑:需求要求A松开后保持显示13直到D按下,但代码没有用寄存器记录“是否需要保持显示13”的状态。当前逻辑只有A按下时才设置LED为0x1A0,A松开后不再写LED,无法持续维持显示状态。
  2. check_D分支变量错误:bne $s3, $t4, exit中的$s3从未被赋值,应该改为先执行andi $t3, $t2, 0x10读取当前D键状态,再用$t3和$t4比较。
  3. 冗余代码:check_D中的andi $t4, $0, 0x10完全多余,前面已经用addi $t4, $0, 0x10将$t4设为0x10,重复操作无意义。
  4. 初始状态未处理:程序启动时$t9的值未初始化,也没有主动将LED设为全灭,无法满足“启动无按键时LED全灭”的要求。
  5. A松开后逻辑缺失:当A松开且D未按下时,代码直接跳回loop,没有对LED执行任何写操作,无法维持显示13的状态。

内容的提问来源于stack exchange,提问作者Need_MathHelp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:05:17