MIPS汇编:从命令行读取字符串转整数的问题排查
MIPS命令行
pa选项参数读取与转换解决方案 你之前操作失败的核心原因:命令行参数在MIPS中是以字符串数组形式传递的,$a1指向的是argv数组,每个数组元素是对应参数字符串的内存地址,而非直接的数值。你之前大概率是直接对这个地址值进行了andi或减48运算,而非读取地址指向的ASCII字符,所以得到的是异常的内存地址数值。
以下是具体解决步骤:
1. 定位-pa选项及其对应参数
遍历argv数组(从索引1开始,索引0是程序名),找到匹配"-pa"的选项字符串,之后的数组元素就是你需要的参数字符串。
示例代码片段:
li $t0, 1 # 从argv[1]开始遍历 loop_find_pa: sll $t1, $t0, 2 # 计算argv[i]的地址:i*4(每个指针占4字节) add $t1, $a1, $t1 # $t1 = &argv[i] lw $t2, 0($t1) # $t2 = argv[i],即当前参数字符串的地址 beqz $t2, pa_not_found # 遍历完所有参数没找到,处理错误 # 逐字符比较当前字符串是否为"-pa" li $t3, '-' lb $t4, 0($t2) bne $t4, $t3, next_arg li $t3, 'p' lb $t4, 1($t2) bne $t4, $t3, next_arg li $t3, 'a' lb $t4, 2($t2) bne $t4, $t3, next_arg lb $t4, 3($t2) bnez $t4, next_arg # 确保是"-pa"而非更长的字符串 # 找到"-pa",获取下一个参数 addi $t0, $t0, 1 sll $t1, $t0, 2 add $t1, $a1, $t1 lw $t2, 0($t1) # $t2 = argv[i+1],即参数字符串地址 beqz $t2, pa_no_arg # 处理"-pa"后无参数的错误 j convert_to_int next_arg: addi $t0, $t0, 1 j loop_find_pa
2. 将参数字符串转换为整数
拿到参数字符串地址后,逐字符读取ASCII值,转换为十进制整数:
convert_to_int: li $v0, 0 # $v0存储最终转换后的整数结果 convert_loop: lb $t3, 0($t2) # 读取当前字符 beqz $t3, convert_done # 遇到字符串结束符'\0',转换完成 blt $t3, '0', invalid_arg # 字符不是数字,处理错误 bgt $t3, '9', invalid_arg subi $t3, $t3, 48 # ASCII转数字:'0'的ASCII值为48 mul $v0, $v0, 10 # 结果乘以10,为下一位数字腾位置 add $v0, $v0, $t3 # 加上当前数字 addi $t2, $t2, 1 # 指针移向下一个字符 j convert_loop convert_done: # 此时$v0就是转换后的整数,可存入目标寄存器使用 # 例如:move $s0, $v0 j main_logic
3. 错误处理补充
需要添加pa_not_found(未找到-pa选项)、pa_no_arg(-pa后无参数)、invalid_arg(参数不是有效数字)的分支处理,避免程序崩溃。
内容的提问来源于stack exchange,提问作者Eric Perez
相关产品推荐
相关产品推荐

