You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MIPS中用循环打印16位二进制整数(含补码)

解决方案:手动循环实现16位补码二进制输出

核心思路

因为不能用syscall 35(MIPS中直接输出二进制的系统调用),我们需要手动逐位提取并输出:

  1. 负数处理:16位补码的负数可以通过 x = x + 65536 转换为对应的无符号值(16位无符号数的模是65536,负数的补码等价于其模65536的结果)。
  2. 逐位提取:从最高位(第15位)到最低位(第0位),通过位掩码与运算判断当前位是0还是1,输出对应字符后,将数值左移一位,重复16次即可。

MIPS汇编实现示例

.data
    prompt: .asciiz "Enter a number (-9999 to 9999): "
    newline: .asciiz "\n"

.text
    main:
        # 提示输入
        li $v0, 4
        la $a0, prompt
        syscall

        # 读取整数
        li $v0, 5
        syscall
        move $t0, $v0       # 将输入值存入$t0

        # 处理负数:转换为16位补码对应的无符号值
        bltz $t0, handle_neg
        j loop_start

    handle_neg:
        addi $t0, $t0, 65536  # 负数+65536得到16位补码的无符号表示

    loop_start:
        li $t1, 16           # 循环计数器:需要输出16位
        li $t2, 0x8000       # 位掩码:1000000000000000(第15位)

    bit_loop:
        and $t3, $t0, $t2    # 提取当前最高位
        beq $t3, $zero, print_zero

        # 输出'1'
        li $v0, 11
        li $a0, '1'
        syscall
        j next_bit

    print_zero:
        # 输出'0'
        li $v0, 11
        li $a0, '0'
        syscall

    next_bit:
        sll $t0, $t0, 1      # 数值左移一位,下一位成为最高位
        addi $t1, $t1, -1    # 计数器减1
        bne $t1, $zero, bit_loop

        # 输出换行
        li $v0, 4
        la $a0, newline
        syscall

        # 退出程序
        li $v0, 10
        syscall

关键细节解释

  • 负数转换:比如输入-1,-1 + 65536 = 65535,对应的二进制就是1111111111111111,正好是16位补码的结果。
  • 位掩码与左移:初始掩码0x8000对应最高位,每次将数值左移一位,把下一位移到最高位位置,配合掩码判断即可逐位输出。
  • 循环控制:用计数器$t1控制循环16次,确保输出正好16位,正数高位自动补0,负数转换后高位为1。

内容的提问来源于stack exchange,提问作者idan noyshul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:22:19