布斯乘法 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 ...
 
随机推荐
- IDEA debug
			
版权声明: 本文转自:https://blog.csdn.net/qq_27093465/article/details/64124330 1,rerun XXX,这个就是直接重新跑某个程序.2,这个 ...
 - UNITY 画布的粗浅理解
			
画布:当画布是screen-space overlay时,这个好理解,画布可以控制如分辨率,层次等.但当画布是 world-space时,这个严格来说就不算是一个画布了,屏幕空间或相机空间的画布是先绘 ...
 - 【301】IDL与C#混合编程
			
目录: 一.COM_IDL_CONNECT 1. 添加组件 2. 组件初始化 3. 功能调用 4. 数据传递 二.IDLDrawWidget组件 C# (C Sharp)是微软公司在2000年6月发布 ...
 - Py小技巧一:在列表,字典,集合中根据条件筛选数据
			
1.过滤掉列表中的某些项---列表解析 data=[1,4,2,8,5,-1] res=[] a.依次迭代列表中每一个项 for x in data: if >=0: res.append(x) ...
 - 从零玩转JavaWeb系列7web服务器-----用户登录界面二维码的制作
			
1.用eclipse工具新建一个Dynamic Web Project工程如下: 2.在Java Resources的src目录下新建一个包,包名称为com.it666.code 3.在com.it6 ...
 - java tomcat报错: Starting Tomcat v7.0 Server at localhost' has encountered a problem问题
			
运行web项目的时候出现下面错误: 出现这个问题的原因是 这个tomcat在其他项目中正在运行 关掉即可.
 - Avro总结(RPC/序列化)
			
Avro(读音类似于[ævrə])是Hadoop的一个子项目,由Hadoop的创始人Doug Cutting(也是Lucene,Nutch等项目的创始人,膜拜)牵头开发,当前最新版本1.3.3.Avr ...
 - JS的事件汇总
			
一.前言 事件的绑定触发有很多种方法,我们如何选择呢? 很多时候,我们会使用鼠标事件,但是鼠标事件只能在PC设备上使用,当我们需要对不同设备兼容时怎么办呢? 二.正文 1. 事件的几个概念: 事件流: ...
 - GRUB使用说明
			
从Red Hat Linux 7.2起,GRUB(GRand Unified Bootloader)取代LILO成为了默认的启动装载程序.相信LILO对于大家来说都是很熟悉的.这次Red Hat Li ...
 - 26-三个水杯(bfs)
			
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...