MIPS汇编16位数字转二进制及最高位位置计算问题求解
MIPS汇编程序修复方案
现有代码问题
- 缺失最高位位置的计算逻辑,遍历二进制位时没有记录第一个置1位的位置
- 打印结果提示文本后没有输出位置值就直接退出程序
- 流程逻辑错误:
prtbin函数内直接调用退出系统调用,无法返回main执行后续逻辑;main末尾的jal main会导致程序无限循环要求用户输入
修复后完整代码
# 1 - Request a number # 2 - Read the number # 3 - Display Binary msg # 4 - Display the number as binary # 5 - Find the left-most bit (loop) # 6 - Display the result msg # 7 - Display the position .data prompt: .asciiz "Enter a 16 bit number: " binaryMsg: .asciiz "\nBinary: " results: .asciiz "\nThe left most bit is in position(zero based): " .text .globl main main: # 输出输入提示 li $v0, 4 la $a0, prompt syscall # 读取用户输入的数字 li $v0, 5 syscall move $a1, $v0 # 输出二进制提示 li $v0, 4 la $a0, binaryMsg syscall # 调用打印二进制+计算最高位位置函数 jal prtbin # 程序正常退出 li $v0, 10 syscall prtbin: add $t0, $zero, $a1 # 把输入值存入$t0 add $t1, $zero, $zero # 清零$t1 addi $t3, $zero, 1 # 加载掩码初始值1 sll $t3, $t3, 15 # 掩码左移15位,从最高位开始遍历 addi $t4, $zero, 16 # 循环计数器,共16位 addi $t5, $zero, -1 # 初始化最高位位置为-1,适配输入为0的情况 loop: and $t1, $t0, $t3 # 输入值和掩码做与运算 beq $t1, $zero, print # 结果为0直接跳转到打印 # 首次碰到置1位时记录位置 bne $t5, -1, skip_record subi $t5, $t4, 1 # 零基位置=当前计数器值-1 skip_record: add $t1, $zero, $zero addi $t1, $zero, 1 # 准备打印1 j print print: # 打印当前位的值 li $v0, 1 move $a0, $t1 syscall srl $t3, $t3, 1 # 掩码右移1位,遍历下一位 addi $t4, $t4, -1 # 计数器减1 bne $t4, $zero, loop # 16位没遍历完就继续循环 # 输出最高位位置提示 li $v0, 4 la $a0, results syscall # 输出最高位位置值 li $v0, 1 move $a0, $t5 syscall jr $ra # 返回main函数
关键改动说明
- 新增
$t5寄存器存储最高位位置,初始值设为-1,当首次遍历到置1位时,通过$t4-1计算得到零基位置存入$t5,输入为0时保持-1 - 移除
prtbin内的退出系统调用,改为jr $ra返回调用点 - 移除
main末尾的jal main逻辑,避免程序无限循环要求输入 - 新增最高位位置值的打印逻辑,输出结果提示后直接打印
$t5存储的位置值
内容的提问来源于stack exchange,提问作者JACKERHAIDAN
相关产品推荐
相关产品推荐

