You need to enable JavaScript to run this app. MARS环境下MIPS程序的输入校验逻辑与独立子例程实现
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.14 05:24:06