如何在MIPS中实现2的补码运算并输出十进制、二进制、十六进制值
MIPS 16位整数补码运算实现
我们要处理的是16位整数的补码,所以首先要把输入的32位整数截断到16位有效位,再按「按位取反 + 加1」的规则计算补码,最后分别打印三种格式的结果即可。
你现有代码的修正点:
- 修复数据段中
twoCompHex字符串的换行符错误,原代码把\n写成了/n - 新增16位掩码做高位截断,避免32位寄存器的高位干扰补码计算
- 补全补码的计算逻辑和对应打印代码
完整可运行代码如下:
.data int: .word 0 prompt: .asciiz "请输入一个16位整数: " msgDec: .asciiz "\n你输入的十进制数: " msgBin: .asciiz "\n你输入的二进制数: " msgHex: .asciiz "\n你输入的十六进制数: " twoComp: .asciiz "\n对应补码的十进制值: " twoCompBin: .asciiz "\n对应补码的二进制值: " twoCompHex: .asciiz "\n对应补码的十六进制值: " # 16位掩码,用于截断高位 mask_16: .word 0x0000ffff .text # 输出提示语 li $v0, 4 la $a0, prompt syscall # 读取用户输入的整数 li $v0, 5 syscall move $t0, $v0 # 打印原数十进制 li $v0, 4 la $a0, msgDec syscall li $v0, 1 move $a0, $t0 syscall # 打印原数二进制 li $v0, 4 la $a0, msgBin syscall move $a0, $t0 li $v0,35 syscall # 打印原数十十六进制 li $v0, 4 la $a0, msgHex syscall move $a0, $t0 li $v0,34 syscall # 计算16位补码 lw $t3, mask_16 # 先截断到16位,清除高位无效值 and $t0, $t0, $t3 # 按位取反 not $t1, $t0 # 取反后也截断到16位 and $t1, $t1, $t3 # 加1得到补码 addi $t2, $t1, 1 # 补码结果截断到16位 and $t2, $t2, $t3 # 打印补码十进制 li $v0, 4 la $a0, twoComp syscall li $v0, 1 move $a0, $t2 syscall # 打印补码二进制 li $v0, 4 la $a0, twoCompBin syscall move $a0, $t2 li $v0, 35 syscall # 打印补码十六进制 li $v0, 4 la $a0, twoCompHex syscall move $a0, $t2 li $v0, 34 syscall # 程序退出 li $v0, 10 syscall
如果需要将补码作为有符号16位数输出十进制,只需要在打印补码十进制前加两行指令sll $t2, $t2, 16、sra $t2, $t2, 16,把16位的有符号值扩展到32位,系统调用打印十进制时就会输出带符号的结果。
内容的提问来源于stack exchange,提问作者Chuzzz
相关产品推荐
相关产品推荐

