布斯乘法 Mips实现 - Booth Algorithm
看了很久网上没有现成的代码和好一点的图,因此当一回搬运工。转自stackoverflow
布斯乘法器的Mips实现方法:
.data
promptStart: .asciiz "This program does AxB without using mult or div"
getA: .asciiz "Please enter the first number(multiplicand): "
getB: .asciiz "Please enter the second number(multiplier): "
space: .asciiz " "
result: .asciiz "The product, using my program is: "
mipMult: .asciiz "The product, using MIPs multu is: "
endLine: .asciiz "\n"
.text
main:
#"welcome" screen
li $v0, # code for print_string
la $a0,promptStart # point $a0 to prompt string
syscall # print the prompt
li $v0, # code for print_string
la $a0,endLine # point $a0 to prompt string
syscall # print the prompt
#prompt for multiplicand
li $v0, # code for print_string
la $a0,getA # point $a0 to prompt string
syscall # print the prompt
#acquire multiplicand
li $v0, # code for read_int
syscall # get an int from user --> returned in $v0
move $s0,$v0 # move the resulting int to $s0
move $s5,$s0 # copy of multiplicand to use in multu
#prompt for multiplier
li $v0, # code for print_string
la $a0,getB # point $a0 to prompt string
syscall # print the prompt
#acquire multiplier
li $v0, # code for read_int
syscall # get an int from user --> returned in $v0
move $s1,$v0 # move the resulting int to $s0
move $s6,$s1 # copy of multiplier to use in multu
jal MyMult
j print
MyMult:
move $s3, $ # lw product
move $s4, $ # hw product
beq $s1, $, done
beq $s0, $, done
move $s2, $ # extend multiplicand to bits
loop:
andi $t0, $s0, # LSB(multiplier)
beq $t0, $, next # skip if zero
addu $s3, $s3, $s1 # lw(product) += lw(multiplicand)
sltu $t0, $s3, $s1 # catch carry-out( or )
addu $s4, $s4, $t0 # hw(product) += carry
addu $s4, $s4, $s2 # hw(product) += hw(multiplicand)
next:
# shift multiplicand left
srl $t0, $s1, # copy bit from lw to hw
sll $s1, $s1,
sll $s2, $s2,
addu $s2, $s2, $t0
srl $s0, $s0, # shift multiplier right
bne $s0, $, loop
done:
jr $ra
print:
# print result string
li $v0, # code for print_string
la $a0,result # point $a0 to string
syscall # print the result string
# print out the result
li $v0, # code for print_int
move $a0,$s4 # put result in $a0
syscall # print out result
li $v0, # code for print_string
la $a0,space # point $a0 to string
syscall # print the result string
li $v0, # code for print_int
move $a0,$s3 # put result in $a0
syscall # print out result
# print the line feed
li $v0, # code for print_string
la $a0,endLine # point $a0 to string
syscall # print the linefeed
doMult:
#Do same computation using Mult
multu $s5, $s6
mfhi $t0
mflo $t1
li $v0, # code for print_string
la $a0,mipMult # point $a0 to string
syscall
# print out the result
li $v0, # code for print_int
move $a0,$t0 # put high in $a0
syscall # print out result
li $v0, # code for print_string
la $a0,space # point $a0 to string
syscall # print the result string
# print out the result
li $v0, # code for print_int
move $a0,$t1 # put low in $a0
syscall # print out result
# print the line feed
li $v0, # code for print_string
la $a0,endLine # point $a0 to string
syscall # print the linefeed
# All done, thank you!
li $v0, # code for exit
syscall # exit program
网上的图太糊了,我重新做了以下,仅供参考。

本贴永久地址:http://www.cnblogs.com/liutianchen/p/6535776.html
布斯乘法 Mips实现 - Booth Algorithm的更多相关文章
- Booth算法
Booth算法 算法描述(载自维基百科) 对于N位乘数Y,布斯算法检查其2的补码形式的最后一位和一个隐含的低位,命名为y-1,初始值为0.对于yi, i = 0, 1, ..., N - 1,考察yi ...
- 补码一位乘法 Booth算法 Java简易实现
本文链接:https://www.cnblogs.com/xiaohu12138/p/11955619.html. 转载,请说明出处. 本程序为简易实现补码一位乘法,若代码中存在错误,可指出,本人会不 ...
- Booth Multiplication Algorithm [ASM-MIPS]
A typical implementation Booth's algorithm can be implemented by repeatedly adding (with ordinary un ...
- [CF932E]Team Work & [BZOJ5093]图的价值
CF题面 题意:求\(\sum_{i=0}^{n}\binom{n}{i}i^k\) \(n\le10^9,k\le5000\) 模\(10^9+7\) BZOJ题面 题意:求\(n*2^{\frac ...
- Verilog乘法器
乘法器,不能用乘号直接表示,略坑呀 坑归坑,做还是要做的 思路:首先乘法分为有符号乘与无符号乘,所以建立两个module分别运算有符号与无符号.然后在总module中用case语句判断输出应赋的值. ...
- 【BZOJ】1754: [Usaco2005 qua]Bull Math
[算法]高精度乘法 #include<cstdio> #include<algorithm> #include<cstring> using namespace s ...
- [Avito Code Challenge 2018 G] Magic multisets(线段树)
题目链接:http://codeforces.com/contest/981/problem/G 题目大意: 有n个初始为空的‘魔法’可重集,向一个‘可重集’加入元素时,若该元素未出现过,则将其加入: ...
- 51nod 1832 前序后序遍历
思路:设只有一颗子树的节点有ans个设前序边历数组为pre[100],后序遍历数组为pos[100]:前序遍历的第二个元素是A的一个子节点左右节点不知,设ax-ay表示一个树的前序遍历,bx-by表示 ...
- 补码一位乘法(Booth算法,C语言实现)
补码一位乘法 首先了解下什么是补码? 补码概念的理解,需要先从“模”的概念开始. 我们可以把模理解为一个容器的容量.当超出这个 容量时,会自动溢出.如:我们最常见到的时钟,其容量 是 12,过了 12 ...
随机推荐
- vue-cli 自定义过滤器的使用
vue-cli 自定义过滤器的使用 vue2.0将内置过滤器去除,所以过滤器需要自己编写. Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插 ...
- leetcode384
public class Solution { private int[] nums; private Random random; public Solution(int[] nums) { thi ...
- 一个简单的语义分析算法:单步算法——Python实现
以前 曾经有一个人教会我一件事 要学会相信一些看似不可能的事 当你真的相信的时候 或许 没有什么事情是不可能的 ——<秦时明月•与子同归> 在编译原理的众多书籍中,陈述了很多生成语法树 ...
- 利用CopyOnWriteArrayList解决并发修改异常问题
一.需求 多个线程再获取同一个集合里面的数据同时,修改集合中的数据. 二.有问题的写法 package com.duchong.juc; import java.util.ArrayList; imp ...
- 深入理解Javascript中构造函数和原型对象的区别(转存)
Object是构造函数,而Object.prototype是构造函数的原型对象.构造函数自身的属性和方法无法被共享,而原型对象的属性和方法可以被所有实例对象所共享. 首先,我们知道,构造函数是生成对象 ...
- 怎样获取datagrid中编辑列combobox的value值与text值
var ed = $('#dg').datagrid('getEditor', {index:editIndex,field:'productid'}); var productname = $(ed ...
- C++中float类型的存储
C++中float用32位来表示,f = (-1)^S * T * 2^E,S是符号位,T是尾数,E是指数 首先我们把f表示成科学计数法的形式,然后再写出其在内存中的表示,在这里T写成1.XXX的形式 ...
- Linux实战教学笔记48:openvpn架构实施方案(一)跨机房异地灾备
第一章VPN介绍 1.1 VPN概述 VPN(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术,可以为企业之间或者 ...
- git的突出解决--git rebase之abort、continue、skip
(1)应用实例描述 假设在github或者gitoschina上建立了一个项目,默认分支为master分支,远程master分支上c.sh文件内容: 开发者A.B分别将项目拷贝到自己本地进行开发 某一 ...
- 112. Path Sum (Tree; DFS)
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...