当前位置: 代码迷 >> 汇编语言 >> 【MIPS】模拟有符号乘法的有关问题(有关问题出在乘数上)
  详细解决方案

【MIPS】模拟有符号乘法的有关问题(有关问题出在乘数上)

热度:414   发布时间:2016-05-02 04:46:34.0
【MIPS】模拟有符号乘法的问题(问题出在乘数上)
我的思路是:(执行32次loop)
初始化sum=0
得到乘数的bit位的方法用的是mask
如:
被乘数: 1011
mask: 0001
bit位的数=被乘数&mask

loop内容:
1.如果乘数的bit位为1,则把被乘数加到sum中
2.右移乘数1位
3.左移被乘数1位

问题在于:
正数*正数 正常运行
负数*正数 正常运行
正数*负数 异常
负数*负数 异常

如果乘数是负数的话,会报错(产生溢出, overflow)

========

运行环境: Qtspim
源代码如下(MIPS):

              .data 0x10010010
msg1:    .asciiz "Please input first num:\n"
msg2:    .asciiz "Please input second num:\n"
msg3:    .asciiz "The result is:\n"
mask:     .word 0x00000001
              .text
              .globl main
main:
              lw $s0, mask   # $s0=1 (the mask)
              addi $t0, $zero, 31   # $t0=31 (The counter)
              move $s2, $zero   # $s2=sum, s2=0

              la $a0, msg1
              li $v0, 4
              syscall
              li $v0, 5
              syscall
              move $s1, $v0 # $s1=FirstNum

              la $a0, msg2
              li $v0, 4
              syscall
              li $v0, 5
              syscall
              move $t1, $v0 # $t1=SecondNum

loop:      and $t2, $s0, $t1# t2= s0 & t1
              beq $t2, $zero, not
              add $s2, $s2, $s1
not:        sll $s1, $s1, 1
              srl $t1, $t1, 1
              addi $t0, $t0, -1 # counter--
              beq $t0, $zero, stop # if counter==0, break loop
              j loop

stop:      la $a0, msg3
              li $v0, 4
              syscall
              move $a0, $s2
              li $v0, 1
              syscall
              li $v0, 10
              syscall


求大神解答啊

------解决方案--------------------
先保存符号,再取正运算,结果再乘以符号数