本文已收录到:MIPS汇编语言学习笔记 专题
- MIPS汇编语言学习笔记03:print HelloWorld
- MIPS汇编语言学习笔记04:print character
- MIPS汇编语言学习笔记05:print integer
- MIPS汇编语言学习笔记06:print a float
- MIPS汇编语言学习笔记07:print a double
- MIPS汇编语言学习笔记08:Adding Integers
- MIPS汇编语言学习笔记09:Subtracting Integers
- MIPS汇编语言学习笔记10:Multiplying Integers (mul方法)
- MIPS汇编语言学习笔记11:Multiplying Integers (mult方法)
- MIPS汇编语言学习笔记12:Multiplying Integers sll
- MIPS汇编语言学习笔记13:Dividing Integers part 1
- MIPS汇编语言学习笔记14:Dividing Integers part 2
- MIPS汇编语言学习笔记15:Introduction to Functions
- MIPS汇编语言学习笔记16:Function Arguments and Return Values
- MIPS汇编语言学习笔记17:将寄存器保存到堆栈
- MIPS汇编语言学习笔记18:函数嵌套调用、递归
- MIPS汇编语言学习笔记19:获取用户输入的整数
- MIPS汇编语言学习笔记20:获取用户输入的单精度浮点数
- MIPS汇编语言学习笔记21:获取用户输入的双精度浮点数
- MIPS汇编语言学习笔记22:获取用户输入的文本
- MIPS汇编语言学习笔记23:if 语句分支指令
- MIPS汇编语言学习笔记26:MIPS While 循环
- MIPS汇编语言学习笔记27:数组
- MIPS汇编语言学习笔记28:使用While循环打印数组
- MIPS汇编语言学习笔记29:数组初始化
- MIPS汇编语言学习笔记30:浮点数(小数)运算
- MIPS汇编语言学习笔记32:浮点数 与 If 语句
任务:整数相乘,并输出打印。
代码:
.data intA: .word 5 intB: .word 2 .text li $v0, 1 lw $a1, intA lw $a2, intB mult $a1, $a2 # 相乘放入固定的HI和LO寄存器 mflo $a0 # 专门用于取LO寄存器中的值,再存入a0寄存器 syscall
本节我参考的之前的笔记,可以顺利写出代码。
MIPS汇编语言学习笔记03:print HelloWorld
HI和LO寄存器作用:
乘法:HI存放结果的高字节,LO存放结果的低字节。
除法:HI存放余数,LO存放除法结果。
Ps:HI和LO作为特殊寄存器,都是临时存储的,如果需要打印等操作,还需要使用 mfhi 或 mflo 指令将其转存。
2021年3月18日更新:上述方法其实是mult方法,即第11讲的内容。我把标题改为11了。
请问如果发生了乘法溢出,如何利用$lo $hi表达出结果?
在32位MIPS体系CPU中支持最多32位相乘,获得的乘法结果最多为64位。
eg:最大的两位数99相乘,99 * 99 = 9801,即最多4位数。MIPS中使用 hi lo寄存器共计保存64位结果。
因此,如果被乘数和乘数都小于32位,不会存在乘法溢出问题。当然,如果被乘数、乘数本身大于了32位,他们不是由CPU本身处理,而是在前一阶段比如编译器中进行预先处理的。