【計(jì)算機(jī)本科補(bǔ)全計(jì)劃】指令:計(jì)算機(jī)的語言(MIPS) --計(jì)算機(jī)組成原理 Part2

正文之前

今天折騰了一天的ubuntu windows雙系統(tǒng),在windows下安裝ubuntu 16.04 然后 安裝引導(dǎo)啟動(dòng)器的時(shí)候選擇的是/boot所在的sda12 每次除非開安全啟動(dòng),否則就沒法進(jìn)去系統(tǒng),現(xiàn)在在 Try Ubuntu 下修復(fù)了一次之后 開機(jī)出現(xiàn)一個(gè) grub>的命令行工具,以前是直接開機(jī)一個(gè) DHCP: \的東西,好麻煩啊,而且按照教程 grub>下選擇了 (hd0,0)這種東西,也沒法˙從C盤啟動(dòng)啊。心疼,現(xiàn)在試試try Ubuntu下的自動(dòng)修復(fù)工具,還不行我就放棄了。直接把原來的盤刪除,然后轉(zhuǎn)回ntfs格式算了,虛擬機(jī)就虛擬機(jī)吧!


正文


1、過程或者函數(shù)是程序員進(jìn)行結(jié)構(gòu)化變成的工具,在過程(子程序)運(yùn)行時(shí),程序必須遵循以下6個(gè)步驟:

  • 將參數(shù)放在過程可以訪問的位置,通俗來說就是,傳入的實(shí)參必須是函數(shù)能夠訪問的;
  • 把控制轉(zhuǎn)交給過程,跳轉(zhuǎn)到程序段·并且開始執(zhí)行;此過程一般是中斷
  • 獲得過程所需要的資源,比如內(nèi)存,處理器等;
  • 執(zhí)行需要的任務(wù);
  • 將結(jié)果的值放到調(diào)用程序可以訪問的位置;返回值咯
  • 將控制返回初始點(diǎn),因?yàn)橐粋€(gè)過程可能由一個(gè)程序中的多個(gè)點(diǎn)調(diào)用。

2、結(jié)合上面的子程序的說法,我們知道在計(jì)算機(jī)中是寄存器的數(shù)據(jù)存取能力最快,所以我們希望盡量的多在寄存器中進(jìn)行任務(wù),那么就有了如下幾個(gè)寄存器的分配

  • $a0~a3四個(gè)寄存器用于傳遞參數(shù)進(jìn)去;
  • $v0~v1 用于返回值的兩個(gè)寄存器;
  • $ra 用于返回起始點(diǎn)的返回地址寄存器。

3、除了寄存器外,MIPS 還包括一條過程調(diào)用指令【 jal Index】:跳轉(zhuǎn)到子程序的地址并且把當(dāng)前位置所在的下一條指令位置存入ra寄存器中,以用于子程序執(zhí)行完后的返回 .

為了支持這種情況,MIPS還使用了寄存器跳轉(zhuǎn)指令 jr 用于case語句,表示無條件跳轉(zhuǎn)到寄存器所指定的地址:jr $ra 。所以,綜上我們就有了如下的定義:調(diào)用程序稱為調(diào)用者caller,被調(diào)子程序稱為被調(diào)用者 callee。caller 把參數(shù)放入$ a0 ~ a3然后使用jal X 調(diào)到callee位置,然后callee執(zhí)行完畢后把返回值放到$ v0 ~ v1 然后再用jr $ra跳回到caller的位置。jr實(shí)際上就是PC+4這個(gè)位置保存到了ra寄存器中。(PC是程序計(jì)數(shù)器的意思。不管是哪兒我感覺都是簡(jiǎn)寫為PC,就是說,這個(gè)東西指在當(dāng)前程序執(zhí)行的指令的位置。)


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

不存在的。那就只能放到存儲(chǔ)器中了。然后在寄存器中的一個(gè)放入存儲(chǔ)器的地址,然后每次調(diào)用一波~。這個(gè)時(shí)候最理想的數(shù)據(jù)結(jié)構(gòu)的是棧。至于什么是棧,please call baidu ~ ,由于使用廣泛,所以MIPS就把29號(hào)寄存器給了棧,$ sp就是棧指針,放入數(shù)據(jù)稱為壓棧,取出稱為出棧。另外,棧指針是從高處往低處走,所以壓入數(shù)據(jù)會(huì)導(dǎo)致指針位置編號(hào)變小。


5、減少寄存器數(shù)據(jù)換出的約定

  • $t0 ~ t9 是十個(gè)臨時(shí)寄存器,過程調(diào)用中不必被調(diào)用者(被調(diào)用的子程序)保存;
  • $ s0 ~ s7是八個(gè)保留寄存器,過程調(diào)用中必須被保存(一旦被使用,就要由被調(diào)用者進(jìn)行保存和恢復(fù))。

6、上述內(nèi)容過一遍之后,我們就可以揣測(cè)一個(gè)嵌套的過程,比如遞歸,自己調(diào)用自己這種用法!編譯一個(gè)遞歸C的過程,并且用MIPS表示出來:

我總結(jié)下,從第一個(gè)fact開始,每一個(gè)fact都會(huì)保存當(dāng)前的指令下一條的位置和當(dāng)前的n值到棧中,具體的表現(xiàn)就是addi $sp,$sp,-8;棧的長(zhǎng)度增加了2個(gè)“字”然后比較當(dāng)前的n值(保存在$a0中)是否小于1,如果小于那么$t0就等于1,不小于就等于0,然后把$t00進(jìn)行比較,如果等于就跳轉(zhuǎn)到L1,不然就接著往下跑,所以如果跳到L1,就會(huì)對(duì)$a0內(nèi)保存的n值執(zhí)行-1的操作,然后繼續(xù)跳回到fact進(jìn)行對(duì)n的檢查。但是如果不跳到L1,也就是說達(dá)到停止條件了,那么就會(huì)忽略beq那一句往下跑,開始從棧頂拋出數(shù)據(jù),同時(shí)對(duì)返回把$v0 修改為$v0*$a0,此處也就是fac(n)=(n-1)*n;然后無條件跳轉(zhuǎn)到上一個(gè)調(diào)用程序fact的下一步,直到結(jié)束!

int fact(int n)
  { if(n<1) return 1;
    else return(n*fact(n-1));
   }
//轉(zhuǎn)換為MIPS的代碼之后如下:
//以過程標(biāo)簽為開始,棧頂保存兩個(gè)寄存器,一個(gè)是返回地址,另一個(gè)是$a0
fact: 
    addi $sp,$sp,-8;
    sw  $ra,4($)sp;
    sw  $a0,0($sp)
//第一次調(diào)用的時(shí)候sw保存程序中調(diào)用fact的地址,然后指令測(cè)試n是否滿足結(jié)束條件小于1
slti  $t0,$a0,1;
beq $t0,$zero,L1;
//如果n小于1,那么fact就把1置入一個(gè)寄存器及并且返回。
addi $v0,$zero,1;
addi $sp,$sp(8);
jr $ra;
//在從棧中退出兩個(gè)內(nèi)容之前,本應(yīng)該加載$a0 和$ra 但是由于n小于1的時(shí)候,兩個(gè)寄存器的內(nèi)容不會(huì)有變化所以就跳過了上面的指令,如果n不小于1,那么n-1后傳入fact中繼續(xù)調(diào)用fact:
L1:
    addi $a0,$a0,-1;
    jal fact;
//下一條指令時(shí)fact的返回位置,從棧頂開始拋出數(shù)據(jù)(拋出數(shù)據(jù)的時(shí)候指針的位置序號(hào)會(huì)變大,前面說過的)
lw $a0,0($)sp;
lw $ra,4($sp);
addi $sp,8;
//接下來,返回值寄存器$v0得到原來的n-1的參數(shù)與當(dāng)前的返回內(nèi)的數(shù)據(jù)進(jìn)行相乘:
mul $v0,$a0,$v0;
//最后 fact 跳轉(zhuǎn)到返回地址;
jr $ra;

7、MIPS匯編語言的寄存器約定,加速大概率事件的思想重要體現(xiàn)


8、J型跳轉(zhuǎn)指令,因?yàn)镸IPS中每一個(gè)操作指令的長(zhǎng)度都是4字節(jié),所以其實(shí)可以用字來表示單位,也就是說,立即數(shù)如果為20000,那么實(shí)際跳轉(zhuǎn)的長(zhǎng)度就是80000byte,也就是20000個(gè)“字”,這樣一來我們的跳轉(zhuǎn)返回就可以增加4倍,另外,我們用“PC相對(duì)尋址”的時(shí)候嗎,其跳轉(zhuǎn)基準(zhǔn)是以PC+4 為基準(zhǔn)的,也就是說,你跳轉(zhuǎn)的距離是相對(duì)于下一條指令來說的!這一點(diǎn)尤為重要,后面會(huì)講到!另外,采用PC跳轉(zhuǎn)尋址是一種加速大概率事件的思想的體現(xiàn)!因?yàn)闂l件跳轉(zhuǎn)有一半都是跳轉(zhuǎn)到PC+4的十六個(gè)指令范圍內(nèi)。

正文之后

誰來救我?。?!Ubuntu雙系統(tǒng)要搞死我了!??!引導(dǎo)修復(fù)要搞死我了。天哪。待我計(jì)算機(jī)組成原理大成之日,就是我的dell電腦身死道消之時(shí)?。。≡诖肆⑹模。。?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容