MIPS Mult两个数字,结果为负数

时间:2014-07-07 03:43:27

标签: mips

我是MIPS的新手,有我的代码:

.text

main: 
        add $s0, $zero, 1       # set $s0 to 0 for the initial value for the following loop
    Loop: jal srand             # Call function srand
        addi $s0, $s0, 1        # $s0 = i++
        slti $s1, $s0, 6        # $s1 < 6
        bne $s1, $zero, Loop    # go to loop in i < 6
        beq $s1, 6, end_loop    # go out the loop when i == 6

    end_loop:
        li $v0, 10
        syscall

    srand:                      # This function will set the numbers for future calculation         
        lw $t0, a               # Load a value to $t0 1103515245
        lw $t1, c               # Load c value to $t1 12345
        lw $t2, m               # Load m value to $t2 2147483648

        multu $t0,$s0       # result for multiplication (Xn*a) and store the result to $t3
        add $t4, $t3, $t1       # result for add multiplication (Xn*a+c) and store the result to $t4

        move $a0, $t4           # Debug function 
        li $v0, 1               # Debug function 
        syscall                 # Debug function 

        la $a0, msg
        li $v0, 4
        syscall

        jr $ra

有一个问题,当代码转到这个“multu $ t0,$ s0”表示并且结果将是错误的。 1103515245 * 2返回负数-2087936806 谁知道怎么修它 ?? 感谢

1 个答案:

答案 0 :(得分:1)

正如chrylis所说,它看起来像整数溢出。如果你不清楚,你应该阅读two's complement整数表示。

基本上,最高位的值被定义为负值。假设您有32位整数。然后,0x800000的值为-2**32,其他位的值为正常值,因此最终得到的表达式看起来像-2**32 + [the sum of the other bits],特别是0xFFFFFFFF -10xFFFFFE的值为-2,依此类推。