MARS环境下MIPS程序的输入校验逻辑与独立子例程实现
MARS仿真环境下MIPS加解密程序的输入校验实现
核心实现思路
基于MARS提供的系统调用机制,将两个交互节点的校验逻辑拆分为独立可复用的子例程,和主流程的加解密业务逻辑完全解耦:
- 所有判定完全基于原生ASCII/数值比较,不做大小写兼容转换,严格匹配需求规则
- 每个校验子例程内置循环逻辑,仅当输入命中规则时才将合法值返回主流程,否则输出统一的非法提示并回到输入起点
- 修正原代码中分支跳转顺序混乱、逻辑链路断裂的问题,保证程序执行流闭合。
独立校验子例程设计
操作选择校验子例程(validate_ed_choice)
- 适用场景:替代原流程中直接读取E/D输入的逻辑
- 判定规则:严格比对输入字符的ASCII码值,仅当值为69(大写'E')、68(大写'D')时判定为合法,其余任意字符(包括小写'e'、'd')均视为非法
- 执行逻辑:
- 循环打印
Type(E)ncrypt/(D)ecrypt:提示语,通过MARS单字符读取接口(syscall 12)获取用户输入 - 逐值比对,命中合法值时将输入值存入约定寄存器
$t6,通过jr $ra返回主流程 - 未命中时打印
\nWrong input提示,回到输入读取步骤
- 循环打印
- 子例程代码片段:
validate_ed_choice: read_ed_loop: li $v0, 4 la $a0, encrypt_decrypt syscall # 打印操作选择提示 li $v0, 12 syscall # 读取单字符输入 move $t6, $v0 li $t0, 69 beq $t6, $t0, ed_valid # 判定是否为合法'E' li $t0, 68 beq $t6, $t0, ed_valid # 判定是否为合法'D' li $v0, 4 la $a0, re_enter syscall # 打印非法输入提示 j read_ed_loop ed_valid: jr $ra # 返回主流程
密钥范围校验子例程(validate_key_range)
- 适用场景:替代原流程中直接读取1-9密钥的逻辑
- 判定规则:基于MARS整数读取接口(
syscall 5)的返回值做闭区间判定,仅当值在1~9范围内时判定为合法 - 执行逻辑:
- 循环打印
\nEnter encryption key (1-9):提示语,通过整数读取接口获取用户输入 - 对输入值做边界比对,小于1或大于9均视为非法
- 合法时将密钥值存入约定寄存器
$s0,通过jr $ra返回主流程 - 非法时打印
\nWrong input提示,回到输入读取步骤
- 循环打印
- 子例程代码片段:
validate_key_range: read_key_loop: li $v0, 4 la $a0, key syscall # 打印密钥输入提示 li $v0, 5 syscall # 读取整数输入 move $s0, $v0 blt $s0, 1, key_invalid # 判定是否小于下界1 bgt $s0, 9, key_invalid # 判定是否大于上界9 j key_valid key_invalid: li $v0, 4 la $a0, re_enter syscall # 打印非法输入提示 j read_key_loop key_valid: jr $ra # 返回主流程
修正后完整可运行代码
将两个校验子例程嵌入原代码框架,替换原流程中混乱的分支逻辑,补全原程序缺失的退出系统调用,完整代码如下:
.data encrypt_decrypt: .asciiz "Type(E)ncrypt/(D)ecrypt:" key: .asciiz "\nEnter encryption key (1-9): " message_prompt: .asciiz "\nEnter message: " output: .asciiz "" re_enter: .asciiz "\nWrong input" buffer: .space 50 .text main: # 调用操作选择校验,获取合法E/D输入 jal validate_ed_choice # 打印消息输入提示,读取用户消息 li $v0, 4 la $a0, message_prompt syscall li $v0, 8 la $a0, buffer li $a1, 48 syscall la $s2, buffer # 调用密钥范围校验,获取合法1-9密钥 jal validate_key_range # 加载处理参数,跳转对应加解密流程 la $t0, ($s0) li $t1, 0 la $t2, ($s2) beq $t6, 69, encrypt beq $t6, 68, decrypt # 操作选择校验子例程 validate_ed_choice: read_ed_loop: li $v0, 4 la $a0, encrypt_decrypt syscall li $v0, 12 syscall move $t6, $v0 li $t0, 69 beq $t6, $t0, ed_valid li $t0, 68 beq $t6, $t0, ed_valid li $v0, 4 la $a0, re_enter syscall j read_ed_loop ed_valid: jr $ra # 密钥范围校验子例程 validate_key_range: read_key_loop: li $v0, 4 la $a0, key syscall li $v0, 5 syscall move $s0, $v0 blt $s0, 1, key_invalid bgt $s0, 9, key_invalid j key_valid key_invalid: li $v0, 4 la $a0, re_enter syscall j read_key_loop key_valid: jr $ra encrypt: encrypt_loop: lb $t3, 0($t2) beq $t3, 10, encrypted add $t3, $t3, $t0 addi $t4, $0, 1 sllv $t4, $t4, $t1 xor $t3, $t3, $t4 sb $t3, 0($t2) addi $t2, $t2, 1 j encrypt_loop encrypted: li $v0, 4 la $a0, output syscall la $a0, ($s2) syscall j exit decrypt: decrypted_loop: lb $t3, 0($t2) beq $t3, 10, decrypted addi $t4, $0, 1 sllv $t4, $t4, $t1 xor $t3, $t3, $t4 sub $t3, $t3, $t0 sb $t3, 0($t2) addi $t2, $t2, 1 j decrypted_loop decrypted: li $v0, 4 la $a0, output syscall la $a0, ($s2) syscall j exit exit: li $v0, 10 syscall
内容的提问来源于stack exchange,提问作者J458
相关产品推荐
相关产品推荐

