如何在MIPS中用循环打印16位二进制整数(含补码)
解决方案:手动循环实现16位补码二进制输出
核心思路
因为不能用syscall 35(MIPS中直接输出二进制的系统调用),我们需要手动逐位提取并输出:
- 负数处理:16位补码的负数可以通过
x = x + 65536转换为对应的无符号值(16位无符号数的模是65536,负数的补码等价于其模65536的结果)。 - 逐位提取:从最高位(第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
相关产品推荐
相关产品推荐

