计组p2碎碎念

// 上机后补充:本次上机的三道编程题分别是【删除一个数字中的某些位,输出最小的可能值(提供了C代码)】、【分解自然数n为x1 + x2 + …的形式并按字典序输出(提供了C代码)】、【双关键字的排序(提供了冒泡排序代码)】。前两题直接翻译题示C代码可以一次通过,第三题只需要按第一个关键字排序后再按第二个排即可,第一次排的时候记得把a、b数组都交换一下,第二次排的时候只有a数组值相等的情况下才交换,逻辑比较简单,直接写出C代码并照翻即可。总的来说本次上机题比较简单,注意做题心态,细心翻译就行。

p.s. 上机前还在跟舍友猜测会不会考二维数组在图论算法中的应用之类的,还翻了一遍Floyd和Dijkstra,大一程设的东西差不多都忘了,不可谓不焦虑。)

1. 优雅的i-j二重循环写法(n重类似)

if-else / for / while / switch-case语句的mips表达直接翻译都很容易,不特别提出了

 li $t0, 0I_Begin:​    slt $t2, $t0, $s0​    beq $t2, $0, I_end​    *#-----------------*​    li $t1, 0​    J_Begin:​      slt $t2, $t1, $s0​      beq $t2, $0, J_end​      *#-----------------*​      *#operation*​      *#-----------------*​      addi $t1, $t1, 1​      j J_Begin​    J_end:​      *#-----------------*​      *#Operation*​      *#-----------------*​    *#-----------------*​    addi $t0, $t0, 1​    j I_BeginI_end:​    jr $31

或许已经有人发现了,做法就是先写一个I_loop,在中间划出一块来填充operation(一重循环),然后将I_loop的所有内容复制一遍,将t0寄存器改成t1,I改成J,然后粘贴到I_loop的operation块中(记得删除J_End中的jr $31),在J_loop的operation块中填写想要的操作即可。如果需要n重循环,就机械地重复复制、修改、粘贴的操作就可以了。

// 注意:这种写法是标准的for循环写法,如果将判断放在计数变量的add操作后,会变成do-while循环,这样非常容易导致代码翻译时的逻辑错误。

// 上机后补充:通过观察水群同学的发言,发现确实有人因为这一点翻译错了题示代码,从而WA了。

2. 将需要进行的操作都分成一个个块,开头读完需要的操作数并进行初始化后,按顺序jal [BLOCKNAME],然后按部就班结束程序,接着再详细书写每一个BLOCK,但切记BLOCK结尾要jr $31

也就是 [模块化开发] 的思想

3. 二位数组的内存处理问题,以16*16的int型数组举例,写法比教程更优雅

好好利用 .macro 对代码进行复用,可以极大地增强代码可读性;但要注意:不允许出现嵌套宏指令!

  .data​    matrix: .word 0 :256  *#读写int型数据时按字读写,使用.word / lw / sw;相应地,按字节读写的char型数据应使用.space / lb / sb*.macro CalTheAddress(%dst, %row, %column, %rank)​    multu %row, %rank​    mflo %dstaddu %dst, %dst, $column​    sll %dst, %dst, 2.end_macro.text​    jal Initial​    jal PutValue​    ​    Initial:​      li $s0, 16 *#s0 = num of rows*​      li $s1, 16 *#s1 = num of columns*​      li $t0, 0  *#t0 = row counter, i*​      li $t1, 0  *#t1 = column counter, j*​      li $t2, 0  *#t2 = the value to be stored*​      jr $31​    PutValue:​      li $t0, 0​      I_Begin:​        slt $t3, $t0, $s0​        beq $t3, $0, I_End​        *#-----------------*​        li $t1, 0​        J_Begin:​          slt $t3, $t1, $s1​          beq $t3, $0, J_End​          *#------------------*​          CalTheAddress($t3, $t0, $t1, $s0)​          lw $t2, matrix($t3)   *#matrix[i \* m + j] = t2*​          *#------------------*​          addi $t1, $t1, 1​          j J_Begin​        I_End:​        *#-----------------*​        addi $t0, $t0, 1​        j I_Begin​      I_End:​        jr $31

4. 在数据段中可以使用.eqv声明静态数据符号,用第二个操作数代替第一个操作数,类似C中的define

 .eqv MAXN 100li $a0, MAXNli $v0, 1syscall

5. 递归时的参数存储与递归回溯操作

存取的对象是:函数参数,$ra寄存器,(如果在循环中)循环计数变量i等:因为我们同时需要维护 pc值 以及每一层递归时使用的变量,包括函数内的临时变量

其实不仅仅是递归,任何需要出入栈维护寄存器的操作,都可以这样实现(倒不如说就是这样实现)

  .macro store(%reg)​    sw %reg, 0($sp)​    addi $sp, $sp, -4.end_mcro.macro load(%reg)​    addi $sp, $sp, 4​    lw %reg, 0($sp).end_macro*#......*store($a0)store($a1)store($t0)store($ra)addi $a0, $a0, 1  *#请注意:进行递归操作时尽量把函数参数都存在$a_寄存器中*jal dfs       *#dfs(x + 1)*load($ra)load($t0)load($a1)load($a0)*#......*jr $31

6. 让代码更好看

这不是也没好看到哪里去吗。)

  *#Ⅰ. 读数#*​    .macro ReadInteger(%n)​      li $v0, 5​      syscall​      move %n, $v0​    .end_macro
 *#Ⅱ. 打印#*​    .macro PrintInteger(%n)​      move $a0, %n​      li $v0, 1​      syscall​    .end_macro
 *#Ⅲ. 建议的架构#*​    .data​      *#Your arrangement#*​    .macro [FuncName](%f1, %f2, ...)​      *#Your Function#*​    .end_macro​    .text​      Read([WhatYouNeed])​      jal Block_1​      jal Block_2​      ......​      jal Block_n​      j end​      Block_1:​        *#YourBlock#*​        jr $31​      ...​      Block_n:​        *#YourBlock#*​        jr $31​      end:​        li $v0, 10​        syscall

最后,感觉关注点就是二维数组 / 多重循环嵌套 / 递归这类在高级语言中很好实现,但在mips汇编语言中需要费一番功夫的东西,比如高精度运算,比如汉诺塔、哈密顿回路等经典递归题目,比如图中的Floyd算法等对二维数组的较高级应用,也比如矩阵的各种花式运算(以考察二维数组使用)等。

不过只要能把C代码正确写出,翻译工作问题还是不大的(擦泪)复习吧,请!

【BUAA_CO_LAB】计组p2碎碎念相关推荐

  1. 【BUAA_CO_LAB】计组p3p4碎碎念

    文章目录 计组P3&P4碎碎念 前言 正文 初见单周期CPU 具体搭建步骤 算术逻辑运算单元ALU 指令存储器IM 通用寄存器堆GRF Ext扩展部件 数据存储器DM 控制信号生成单元CU N ...

  2. 数据分析+数据挖掘暑期实习碎碎念

    写在前面 在闺蜜的博客乱写一篇关于最近春招的心得! 先念念叨一点麻痹自我的鸡汤. 鸡汤说:要有最朴素的生活与最遥远的梦想,即使明日天寒地冻,路遥马亡. 鸡汤还说:慢慢走比较快:踏实一点,你想要的岁月都 ...

  3. 2022年电设省赛碎碎念【C题小车题省一】

    一些备赛的时间轴 碎碎念 前期准备 为期20天的培训 图形获取和指示系统 智能小车 自动行驶小车 省赛 写在最后 碎碎念 电赛准备主要集中在七月份,前前后后做了三道题就直接比赛了.我们的准备确实很充分 ...

  4. 【2022团体程序设计天梯赛】赛后的一些个人碎碎念

    仅是一些个人感想的碎碎念,没有对比赛的题目分析和看法. 终于是打完了2022年的天梯赛,个人成绩一般般,没有超常的发挥,也算不上失常,说得上是中规中矩吧.对我来说,天梯赛有着特殊的意义,心里自然也是感 ...

  5. 前端碎碎念 之 nextTick, setTimeout 以及 setImmediate 三者的执行顺序

    『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到. 我会查阅一些资料并可能加上自己的理解,来记录这些问题.更多文章请前往我的个人博客 ...

  6. 参加海峡两岸城市地理信息系统论坛2010 年会(一张图、规划信息化和空间句法的碎碎念)...

    上周末去清华建筑学院开了个会,叫做海峡两岸城市地理信息系统论坛2010 年会,主题很大,但是内容比较集中一些,就是围绕着GIS与城市规划.一天下来听了20个报告,挺佩服主办方的时间控制,这么密集的报告 ...

  7. Jerry的碎碎念:SAPUI5, Angular, React和Vue

    2019独角兽企业重金招聘Python工程师标准>>> 去年我去一个国内客户现场时,曾经和他们IT部门的一位架构师聊到关于在SAP平台上进行UI应用的二次开发时,UI框架是选用UI5 ...

  8. PMcaff写给大家的年终碎碎念 PMcaff | 记录

    今天是大年三十,2014马上就要结束了,送上新春祝福之前,碎碎念的小希有话想跟大家说. 瞧这一年 小米在硬件行业继续如鱼得水,科幻片里的智能家居生慢慢变成生活. 阿里巴巴在纳克达斯扬眉吐气了一把,一夜 ...

  9. 数据结构碎碎念(一)

    碎碎念 在大一学习C语言的时候,举过一个用栈实现的括号匹配算法,当时觉得很难,不过现在回顾起来,这个算法也算是比较简单的一个关于栈的应用了.而现在所常见的算法问题也都是什么中缀表达式转后缀表达式,双栈 ...

最新文章

  1. git 从远程主服务器当中创建新分支
  2. 入门大爆炸式发展的深度学习,你先要了解这4个最流行框架
  3. 计算机科学班(原acm班),计算机科学创新实验班(以下简称ACM班)培养计划.doc
  4. JavaScript垃圾回收机制理解
  5. 漫画算法:无序数组排序后的最大相邻差值
  6. MyBatis 数据持久层
  7. Linux linux下的进程状态
  8. A - C语言实验——最值
  9. OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
  10. JavaScript学习之初识JS
  11. 12306网上买火车票怎么选择上中下铺
  12. 强烈推荐!Python 这个宝藏库 re 正则匹配
  13. 保护您的AWS网站免受DDoS攻击
  14. CY5-N-羟基琥珀酰亚胺|cas146368-14-1|荧光量子产率
  15. 【前端库】moment.js 时间库
  16. company corporation enterprise 等等公司名称的区别
  17. 动态规划最佳缝合线查找(Image Stitching 3)
  18. 学成在线HTML代码,学成在线页面制作(HTML+CSS部分)(顶部+轮播图部分)
  19. 【流媒体服务器Mediasoup】多人音视频架构、流媒体的比较、mediasoup介绍 (一)
  20. 刷题之旅第33站,CTFshow web12

热门文章

  1. Dialog based MFC
  2. 数学基础知识总结 —— 11. 什么是泰勒公式与泰勒级数
  3. 某简壁纸(ob混淆,js逆向)
  4. “很抱歉,出现错误,word不能启动”超简单解决方法
  5. mysql重迭算法_MySQL – 如何选择’DISTINCT’重叠时段(日期或数字范围)
  6. 关于抖音网红推广,你想知道的50个问题都在这里!
  7. opencv mat 类型转换 CV_32FC1--CV_8U
  8. hbw-utils - ColUtils
  9. Jenkins安装时Web页面报错:该Jenkins实例似乎已离线
  10. Count,TPM,FPKM,CPM之间的格式转换——Count转TPM