近万字MIPS小白进阶教程!(包含变量使用、代码结构、循环、分支、数组、栈使用、递归位运算等等知识)

前言

本文为博主在学习mips时的一些基本笔记(苦于计组实验需要用到mips,而全网对mips小白的基础教程是在太少,有也不全面),因为是全英文课程,所以索性笔记也用了英文来记(当然都是很通俗易懂初中英语水平就差不多能看懂了嗷),是油管博主Amell录制的mips基础视频(可以说是全网最最基础的mips教程了,各种变量、代码结构、循环、分支、数组、栈使用、递归都有涉及)

注意:本文知识点很全,但是比较适合已经理解mips基本常识的童鞋学习(因为是学习笔记嘛,博主也不可能事无巨细的把所有东西都记录一遍,纯小白可以直接看下面的mips学习视频,把我的笔记当做对照来用就行)

YouTube原视频链接(全英文字幕)

没有vpn的童鞋可以看下面这个,不过哔哩哔哩上少了最后一课时(二维数组的应用)

bilibili搬运链接(附带机翻字幕)


关于算法实现部分,之后会更新一些相关实例
让我康康有多少Buaaer👀

反汇编

这里提供一个反汇编的网站,可以把你的高级语言程序直接反汇编为mips,对理解mips中的栈思想非常有帮助,
也可以更好的理解变量等等在mips中是怎么传递的,理解$s0-$s7为什么被定义为需要恢复为原值的寄存器
反汇编

.data

存放在内存中的数据类型声明

frequent use syscall arguments

Code in $v0 Service notes(注意点)
1 print integer in $a0 -
2 print float in $f12 -
3 print double in $f12 -
4 print string(across address) in $a0 -
5 read integer into $v0 -
6 read float into $f0 -
7 read double into $f0(exactly saved in $f0 and in $f1) -
8 $a0 = address of input buffer,$a1 = maximum number of characters to read if $a0==n,so the max number input is n-1,because the final character is ‘\0’,and if n==1,input is ignored and null byte placed at buffer address. If n<1, input is ignored and nothing is written to the buffer. (what’s more,’\n’ will be read)
10 exit the whole programm -

type

char

.data # 数据声明区域
    # name: .type values
    char: .byte 'M' # 将一个字符保存在一个字节的存储空间里
    endline: .byte '\n' # 常用,换行符
    # 记得字符要使用单引号声明
.text # 代码区域
main:
    li $v0 4 # 表示输出$a0中char类型的内容
    la $a0 char # 将char常量的地址保存在$a0中
    syscall

string

.data
    string1: .ascii "12345" # 将字符串存储在存储空间里,根据字符串长度自动分配空间
    string2: .asciiz "12345" # 与ascii的区别是会自动在末尾添加'\0',避免了字符串的连接
.text
main:
    li $v0 4 # byte和ascii都是字符类型,参数为4
    la $a0 string2 # 将string2的地址传入
    syscall

int

.data
    age: .word 23 # 将一个整数保存在一个4字节的存储空间里
.text
main:
    li $v0 1
    lw $a0 age # 可能是因为int的原因,只能传入int的值,无法传入地址
    syscall

float

关于float的保存位置(下图为Mars中的Coproc1)

https://i.loli.net/2021/10/04/C5MjckLzwh2RerK.png

.data
    PI: .float 3.1415926 # 同样将浮点数保存在存储空间中
.text
main:
    li $v0 2 # float的syscall参数
    # 就像计算机组成原理说的那样,对于浮点型的数据并不是保存在通用寄存器里,所以不能使用lw指令导入
 
  • 15
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
卷积运算是数字信号处理中常用的一种操作,可以用于图像处理、音频处理等领域。在MIPS汇编语言中,可以使用卷积运算实现图像模糊、锐化等效果。以下是一个简单的MIPS汇编程序,用于执行一维离散卷积运算: .data A: .word 1, 2, 3, 4, 5, 6, 7, 8, 9 B: .word 1, 2, 1, 2 res: .space 36 .text .globl main main: la $t0, A #Load A 的地址到$t0 la $t1, B #Load B 的地址到$t1 la $t2, res #Load res 的地址到$t2 li $t3, 9 #Set $t3 to 9, A 的大小 li $t4, 4 #Set $t4 to 4, B 的大小 li $t5, 2 #Set $t5 to 2, B 的中心位置 add $t6, $zero, $zero #Initialize $t6 to 0, 作为计数器 .add_loop: li $t7, 0 #Initialize $t7 to 0, 作为累加器 add $t8, $t6, $t5 #计算当前中心点的位置 sub $t8, $t3, $t8 #用总长度减去当前的位置,得到卷积核的起始位置 .b_loop: lw $t9, 0($t1) #读出卷积核的一个元素 lw $t10, 0($t0) #读出A中的一个元素 mult $t9, $t10 #相乘 mflo $t11 #将结果存储在$t11中 add $t7, $t7, $t11 #将结果累加到$t7中 addi $t1, $t1, 4 #B的指针向右移动 addi $t8, $t8, 4 #卷积核指针向右移动 bne $t8, $zero, .b_loop #如果卷积核指针没有到结尾,则继续进行 sw $t7, 0($t2) #将结果存储在res数组中 addi $t0, $t0, 4 #A的指针向右移动 addi $t2, $t2, 4 #res的指针向右移动 addi $t6, $t6, 1 #计数器加1 blt $t6, $t3, .add_loop #如果计数器没有超过A的大小,则继续进行 #程序结束 在上面的代码中,我们定义了三个数组A、B和res,分别存储输入信号、卷积核和卷积结果。程序使用两个指针$t0和$t1来遍历数组A和B,并且使用一个计数器$t6来记录当前的卷积操作的位置。卷积核B的大小为4,中心位置为2,因此我们需要使用$t5来存储中心位置,用于计算卷积核的起始位置。在每次执行卷积操作时,程序使用一个累加器$t7来计算卷积结果,并将其存储在数组res中。 总体来说,这是一个比较简单的一维离散卷积的实现,但是可以根据需求进行改进和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值