【计算机本科补全计划】指令:计算机的语言(MIPS) --计算机组成原理 Part2

正文之前

今天折腾了一天的ubuntu windows双系统,在windows下安装ubuntu 16.04 然后 安装引导启动器的时候选择的是/boot所在的sda12 每次除非开安全启动,否则就没法进去系统,现在在 Try Ubuntu 下修复了一次之后 开机出现一个 grub>的命令行工具,以前是直接开机一个 DHCP: \的东西,好麻烦啊,而且按照教程 grub>下选择了 (hd0,0)这种东西,也没法˙从C盘启动啊。心疼,现在试试try Ubuntu下的自动修复工具,还不行我就放弃了。直接把原来的盘删除,然后转回ntfs格式算了,虚拟机就虚拟机吧!


正文


1、过程或者函数是程序员进行结构化变成的工具,在过程(子程序)运行时,程序必须遵循以下6个步骤:

  • 将参数放在过程可以访问的位置,通俗来说就是,传入的实参必须是函数能够访问的;
  • 把控制转交给过程,跳转到程序段·并且开始执行;此过程一般是中断
  • 获得过程所需要的资源,比如内存,处理器等;
  • 执行需要的任务;
  • 将结果的值放到调用程序可以访问的位置;返回值咯
  • 将控制返回初始点,因为一个过程可能由一个程序中的多个点调用。

2、结合上面的子程序的说法,我们知道在计算机中是寄存器的数据存取能力最快,所以我们希望尽量的多在寄存器中进行任务,那么就有了如下几个寄存器的分配

  • $a0~a3四个寄存器用于传递参数进去;
  • $v0~v1 用于返回值的两个寄存器;
  • $ra 用于返回起始点的返回地址寄存器。

3、除了寄存器外,MIPS 还包括一条过程调用指令【 jal Index】:跳转到子程序的地址并且把当前位置所在的下一条指令位置存入ra寄存器中,以用于子程序执行完后的返回 .

为了支持这种情况,MIPS还使用了寄存器跳转指令 jr 用于case语句,表示无条件跳转到寄存器所指定的地址:jr $ra 。所以,综上我们就有了如下的定义:调用程序称为调用者caller,被调子程序称为被调用者 callee。caller 把参数放入$ a0 ~ a3然后使用jal X 调到callee位置,然后callee执行完毕后把返回值放到$ v0 ~ v1 然后再用jr $ra跳回到caller的位置。jr实际上就是PC+4这个位置保存到了ra寄存器中。(PC是程序计数器的意思。不管是哪儿我感觉都是简写为PC,就是说,这个东西指在当前程序执行的指令的位置。)


4、如果我们要使用更多寄存器?

不存在的。那就只能放到存储器中了。然后在寄存器中的一个放入存储器的地址,然后每次调用一波~。这个时候最理想的数据结构的是栈。至于什么是栈,please call baidu ~ ,由于使用广泛,所以MIPS就把29号寄存器给了栈,$ sp就是栈指针,放入数据称为压栈,取出称为出栈。另外,栈指针是从高处往低处走,所以压入数据会导致指针位置编号变小。


5、减少寄存器数据换出的约定

  • $t0 ~ t9 是十个临时寄存器,过程调用中不必被调用者(被调用的子程序)保存;
  • $ s0 ~ s7是八个保留寄存器,过程调用中必须被保存(一旦被使用,就要由被调用者进行保存和恢复)。

6、上述内容过一遍之后,我们就可以揣测一个嵌套的过程,比如递归,自己调用自己这种用法!编译一个递归C的过程,并且用MIPS表示出来:

我总结下,从第一个fact开始,每一个fact都会保存当前的指令下一条的位置和当前的n值到栈中,具体的表现就是addi $sp,$sp,-8;栈的长度增加了2个“字”然后比较当前的n值(保存在$a0中)是否小于1,如果小于那么$t0就等于1,不小于就等于0,然后把$t00进行比较,如果等于就跳转到L1,不然就接着往下跑,所以如果跳到L1,就会对$a0内保存的n值执行-1的操作,然后继续跳回到fact进行对n的检查。但是如果不跳到L1,也就是说达到停止条件了,那么就会忽略beq那一句往下跑,开始从栈顶抛出数据,同时对返回把$v0 修改为$v0*$a0,此处也就是fac(n)=(n-1)*n;然后无条件跳转到上一个调用程序fact的下一步,直到结束!

int fact(int n)
  { if(n<1) return 1;
    else return(n*fact(n-1));
   }
//转换为MIPS的代码之后如下:
//以过程标签为开始,栈顶保存两个寄存器,一个是返回地址,另一个是$a0
fact: 
    addi $sp,$sp,-8;
    sw  $ra,4($)sp;
    sw  $a0,0($sp)
//第一次调用的时候sw保存程序中调用fact的地址,然后指令测试n是否满足结束条件小于1
slti  $t0,$a0,1;
beq $t0,$zero,L1;
//如果n小于1,那么fact就把1置入一个寄存器及并且返回。
addi $v0,$zero,1;
addi $sp,$sp(8);
jr $ra;
//在从栈中退出两个内容之前,本应该加载$a0 和$ra 但是由于n小于1的时候,两个寄存器的内容不会有变化所以就跳过了上面的指令,如果n不小于1,那么n-1后传入fact中继续调用fact:
L1:
    addi $a0,$a0,-1;
    jal fact;
//下一条指令时fact的返回位置,从栈顶开始抛出数据(抛出数据的时候指针的位置序号会变大,前面说过的)
lw $a0,0($)sp;
lw $ra,4($sp);
addi $sp,8;
//接下来,返回值寄存器$v0得到原来的n-1的参数与当前的返回内的数据进行相乘:
mul $v0,$a0,$v0;
//最后 fact 跳转到返回地址;
jr $ra;

7、MIPS汇编语言的寄存器约定,加速大概率事件的思想重要体现


8、J型跳转指令,因为MIPS中每一个操作指令的长度都是4字节,所以其实可以用字来表示单位,也就是说,立即数如果为20000,那么实际跳转的长度就是80000byte,也就是20000个“字”,这样一来我们的跳转返回就可以增加4倍,另外,我们用“PC相对寻址”的时候吗,其跳转基准是以PC+4 为基准的,也就是说,你跳转的距离是相对于下一条指令来说的!这一点尤为重要,后面会讲到!另外,采用PC跳转寻址是一种加速大概率事件的思想的体现!因为条件跳转有一半都是跳转到PC+4的十六个指令范围内。

正文之后

谁来救我!!!Ubuntu双系统要搞死我了!!!引导修复要搞死我了。天哪。待我计算机组成原理大成之日,就是我的dell电脑身死道消之时!!!在此立誓!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容