【问题标题】:Mips Overflow Detection , Printing the ResultMips溢出检测,打印结果
【发布时间】:2018-02-05 10:01:45
【问题描述】:

我写下这个简单的代码只是为了验证 Mips 处理器中的溢出以进行最终测试:

.data
.text
.globl main
 main:
    li $s0, 2000000000
    li $s1, 2000000000


    addu, $s2 , $s0, $s1

    li $v0, 1
    move $a0, $s2
    syscall
    j end


    end: 

    li $v0, 10
    syscall

它当然会导致 0xee6b2800,十进制 -294967296,只是因为 mips 将数字编码为二进制补码并将 MSB 识别为符号位(1,及其负数)。 我怎样才能实现一个循环来打印(在同一个程序中)正确的值? (在本例中为 4 Bil,4x10^9) 非常感谢

【问题讨论】:

    标签: overflow mips mips32


    【解决方案1】:

    如果你知道操作数和结果,检测溢出并不难:

    li $s0, 2000000000
    li $s1, 2000000000
    
    addu $s2 , $s0, $s1
    
    xor $t0, $s0, $s2   # $t0 = op1 ^ result
    xor $t1, $s1, $s2   # $t1 = op2 ^ result
    and $t0, $t0, $t1   # $t0 = (op1 ^ result) & (op2 ^ result)
    bltz $t0, overflow
    

    当两个同号的数相加得到一个符号相反的数时,就会发生有符号溢出。

    对于 32 位数字,如果 ((op1 ^ result) & 0x80000000) == 0x80000000),则 op1result 符号相反。

    因此,如果(((op1 ^ result) & (op2 ^ result)) & 0x80000000) == 0x80000000),那么这一定意味着op1result有相反的符号,并且op2result也有相反的符号,因此op1op2必须有相同的标志。这正是我们想要检查的。 bltz 只是检查是否设置了最高有效位 (0x80000000) 的一种更简单的方法。


    要将值打印为无符号整数,您可能必须编写自己的 int 到字符串转换例程,然后使用 print_string 系统调用打印结果字符串。这是一个相当简单的操作,如果您进行一些搜索,您应该能够找到示例(可能不是专门针对 MIPS,但无论指令集如何,算法都是相同的)。

    【讨论】:

    • 我尝试在 Mars 上使用 syscall 36(打印无符号),我正确打印了 4bil,但我没有得到你的 XOR 和 AND 操作,是那些用于从二进制补码转换为无符号的操作吗?
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多