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

soul376 2013-11-24 02:37:36
我的思路是:(执行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


求大神解答啊
...全文
333 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
soul376 2013-11-28
  • 打赏
  • 举报
回复
引用 2 楼 enlinux 的回复:
先保存符号,再取正运算,结果再乘以符号数
谢谢哦,看来也只能用这种方法了,我一直以为还有其他解决方案呢
子善旬 2013-11-25
  • 打赏
  • 举报
回复
先保存符号,再取正运算,结果再乘以符号数
soul376 2013-11-25
  • 打赏
  • 举报
回复
饿。。。。汇编区人气不够吗?。。。。。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧