如何在RARS的Digital Lab Sim中提取按键对应的十进制值?
在RARS Digital Lab Sim中提取按键对应的十进制值
核心认知纠正
你之前的误区在于把按键码当成了内存地址——实际上RARS返回的按键码是32位的按键标识值,不是内存地址,所以用lw读取这个地址的操作完全无效,这是失败的原因。
两种可行解决方案
方案1:建立扫描码-目标值映射表
针对你需要的数字键、a-f键,先通过打印确认每个按键对应的32位码(比如你提到数字3对应0xffffff81),然后用映射表匹配转换:
.data # 映射表结构:每个条目是[按键码, 对应十进制值],末尾用0标记结束 key_map: .word 0xffffff81, 3 # 数字3 .word 0xffffffXX, 10 # 替换XX为实际'a'的按键码 .word 0xffffffYY, 16 # 替换YY为实际'f'的按键码 # 可继续添加其他需要的按键 .word 0, 0 # 表尾标记 .text # 假设按键码已存入$t0 la $t1, key_map # 加载映射表起始地址 loop_check: lw $t2, 0($t1) # 读取当前条目按键码 beq $t2, $zero, not_found # 到表尾,未匹配到按键 beq $t0, $t2, match_found # 匹配成功 addi $t1, $t1, 8 # 移动到下一个条目(每个条目占8字节) j loop_check match_found: lw $t3, 4($t1) # 读取对应的十进制值,$t3即为目标结果 j done not_found: # 处理未识别按键的逻辑(比如赋值错误标记) li $t3, -1 done: # 后续可打印$t3或继续处理
方案2:利用按键码的连续规律计算
如果目标按键的码是连续的(比如数字键0-9的码依次递增),可以直接通过偏移计算得到对应值:
数字键示例(假设数字0对应0xffffff80,依次递增):
# 按键码存入$t0 li $t1, 0xffffff80 # 数字0的按键码 sub $t2, $t0, $t1 # 计算偏移量,结果即为对应数字(0-9) # 先校验是否在数字键范围内,避免错误 blt $t2, $zero, invalid_key bgt $t2, 9, invalid_key # 此时$t2就是数字键对应的十进制值
a-f键示例(假设a对应0xffffffXX,f对应0xffffffXX+5):
li $t1, 0xffffffXX # 'a'的实际按键码 sub $t2, $t0, $t1 addi $t2, $t2, 10 # 偏移量+10,得到10(a)-15(f) # 校验范围 blt $t2, 10, invalid_key bgt $t2, 15, invalid_key # $t2即为a-f对应的十进制值
验证按键码的小技巧
如果不确定某个按键的实际码,可以先打印出来确认:
# 假设按键码在$t0中 li $v0, 34 # RARS打印十六进制的系统调用 move $a0, $t0 syscall
内容的提问来源于stack exchange,提问作者newbie01
相关产品推荐
相关产品推荐

