2023 BUAA CO review: P2
MIPS汇编
一些常用宏
1 | # 程序结束 |
一些tips
- 取用指令时,记得多查看指令集手册和
MARS
的帮助手册(快捷键F1
)。
虽然MARS
没有代码补全功能,但是书写指令的时候会有提示(格式和大概用法等等)
所以指令记个大概也没关系,比如利用b->branch
,g(t)->greater (than)
, z->zero
等等可以很方便地写出多种多样的控制语句
- 善用扩展指令
li
,la
,move
等 - 灵活使用标签(并不一定要用来跳转)和缩进(,这样看起来能有一些层次感
- 函数的调用和递归函数
jal
和jr
配套- 传参一般使用
$a0-$a3
,返回值$v0-$v1
- 关于写递归函数的时候什么东西要入栈,什么不要,其实很简单,只需要把进行递归前后发生变化的、且寄存器中的值关系到后续(递归回来)使用的寄存器进行保存和恢复就好了
- 接上一条,进入函数的时候就先把要保存的进行入栈(包括
$ra
),然后在函数结束和return
的地方进行出栈即可
- 写一些必要的注释,标明寄存器保存的重要的变量和参数
- 可以将对应的C程序写出,再对着翻译
课下提交
Q1 P2_L0_matrix
使用MIPS汇编语言编写一个具有矩阵相乘功能的汇编程序(不考虑延迟槽)。
具体要求:
- 首先读取方形矩阵的阶数n,然后再依次读取第一个矩阵(n行n列)和第二个矩阵(n行n列)中的元素。
- 两个矩阵的阶数相同,我们提供的测试数据中0<n≤8,每个矩阵元素是小于10的整数。
- 最终将计算出的结果输出,每行n个数据,每个数据间用空格分开。评测机会自动过滤掉行尾空格以及最后的回车。
- 使用
syscall
结束程序。
考察二维数组的使用
Code(仅供参考)
1 | .data |
Q2 P2_L0_judge
实现满足下面功能的汇编程序:
- 判断输入的字符串是不是回文串。
- 输出一个字符,是回文串输出1,否则输出0
- 每组数据最多执行100,000条指令。
- 使用
syscall
结束程序
注意如果一次读取一个字符($v0 = 12
),记得使用lb
,sb
进行存取使用
Code(仅供参考)
1 | .data |
Q3 P2_L0_conv
使用MIPS汇编语言编写一个进行卷积运算的汇编程序(不考虑延迟槽)。
具体要求:
- 首先读取待卷积矩阵的行数m1和列数n1,然后读取卷积核的行数m2和列数n2。
- 然后再依次读取待卷积矩阵(m1行n1列)和卷积核(m2行n2列)中的元素。
- 输出中,有m1-m2+1行,每行有n1-n2+1个数据,每个数据用空格分开。
- 卷积运算的定义:$$g(i, j) = \sum\limits_{k,l} f(i + k, j + l) \cdot h(k, l)$$其中f为待卷积矩阵,h为卷积核,g即为输出矩阵,k与l的终值分别为卷积核h的行大小、列大小。计算中不考虑边缘效应。
- 使用
syscall
结束程序
Code(仅供参考)
1 | .data |
Q4 P2_L0_full_1
实现满足下面功能的汇编程序:
- 使用mips实现全排列生成算法。
- 以0x00000000为数据段起始地址。
- 输入一个小于等于6的正整数,求出n的全排列,并按照字典序输出。
- 每组数据最多执行500,000条指令。
- 使用
syscall
结束程序
一道递归题,注意递归返回的时候 即代码 FullArray(index+1); 后,除了保存恢复下标i,还要记得重新计算下标地址 需要用来撤销symbol标记( <<2 )
Code(仅供参考)
1 | .data |
附加题Q1 P2_L1_puzzle
使用深度优先探索算法求解01迷宫的逃离路线个数。
如左图,以红色0作为起点,绿色0作为终点,每一次行进只能选择上下左右中值为0且未走过的位置,满足上述条件的路线,即为一条迷宫逃跑路线。如右图中,蓝色的路线即为一条逃跑路线。
输入一个n*m的01矩阵作为01迷宫,并给定他的起点与终点,求出他不同逃跑路线的数目(不同逃跑路线中可以有相同的部分,但是不能完全相同)。
C代码
1 |
|
Code(仅供参考)
1 | .data |
附加题Q2 P2_L1_factorial
使用MIPS汇编语言编写一个求n的阶乘的汇编程序(不考虑延迟槽)。
具体要求:
- 第一行读取n
- 计算并输出n的阶乘,输出字符串长度小于等于1000
- 步数限制为200,000
- 使用
syscall
结束程序
C代码
1 |
|
Code(仅供参考)
1 | .data |
课上考试
评论