6.1 子例程機(jī)制電子課件_第1頁(yè)
6.1 子例程機(jī)制電子課件_第2頁(yè)
6.1 子例程機(jī)制電子課件_第3頁(yè)
6.1 子例程機(jī)制電子課件_第4頁(yè)
6.1 子例程機(jī)制電子課件_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

子例程子程序現(xiàn)代程序設(shè)計(jì)語(yǔ)言的靈魂提供了抽象的能力將一個(gè)組件的功能與其實(shí)現(xiàn)的細(xì)節(jié)分隔開來(lái)程序員只需理解組件的結(jié)構(gòu),不需要考慮其實(shí)現(xiàn)的細(xì)節(jié),就能夠把該組件作為一個(gè)程序塊使用子程序使程序員能夠以模塊化的方式寫程序,提高了構(gòu)建復(fù)雜系統(tǒng)的能力子例程在一個(gè)程序中,多次執(zhí)行某個(gè)程序片段在程序內(nèi),不必每次給出這個(gè)程序片段通過多次調(diào)用該程序片段實(shí)現(xiàn)子例程(Subroutine)/函數(shù)(Function,C語(yǔ)言)子例程機(jī)制調(diào)用/返回機(jī)制程序片段A示例程序片段A:做乘法運(yùn)算的指令序列x9=x10*x11 andi x9,x9,0 #x9,積 loop: ...... #省略x9=x10*x11的實(shí)現(xiàn)細(xì)節(jié) j loop exit: ...... #下一個(gè)任務(wù)調(diào)用/返回機(jī)制調(diào)用機(jī)制計(jì)算子例程的起始地址,加載到PC,并保存返回地址返回機(jī)制將返回地址加載到PC中JAL和JALR指令使用無(wú)條件跳轉(zhuǎn)指令,實(shí)現(xiàn)了調(diào)用/返回機(jī)制JAL:JumpandLink“PC-相對(duì)”尋址模式,計(jì)算子例程的起始地址JALR:JumpandLinkRegister“基址+偏移量”尋址模式,計(jì)算子例程的起始地址通常設(shè)置目標(biāo)寄存器為x1,保存返回地址/鏈接JALPC

PC+SEXT(imm[20:0])x1PC+4地址311211760x0040000000000000110000000000000011101111

imm[20|10:1|11|19:12]x1jalJAL指令匯編格式JAL x1,LABELLABEL,標(biāo)識(shí)JAL指令的目標(biāo)例如,jalx1,Multiply下一條被執(zhí)行的指令被Multiply標(biāo)識(shí)的指令并且,在x1中保存返回地址Multiply子例程Multiply: andi x9,x9,0 #x9,積loop: ...... #省略x9=x10*x11的實(shí)現(xiàn)細(xì)節(jié) j loopexit: jalr x0,0(x1)

#返回使用jalrx0,0(x1)結(jié)束子例程JALRPC

(rs1)+SEXT(imm[11:0])x1

PC+4jalr指令的匯編指令格式為jalr x1,imm12(rs1)或jalr x1,rs1,imm12地址31201915141211760x0040000011111111110000101000000011100111

imm[11:0]x5jalrx1I-類型跳轉(zhuǎn)問題:什么是JALR指令能夠提供的而JAL指令無(wú)法提供的重要特點(diǎn)?jal指令計(jì)算出的地址被限制于內(nèi)存的一定范圍之內(nèi)偏移范圍為-220到220-1jalr指令對(duì)于下一條被執(zhí)行的指令位于何處沒有限制偽指令call使用JALR指令,調(diào)用子例程:如何計(jì)算子例程的起始地址,將其賦值給rs1?對(duì)于匯編程序員來(lái)說,可以使用偽指令,簡(jiǎn)化編程工作callLabel匯編器將其翻譯為jalr指令callLabel匯編器按照內(nèi)存分配的規(guī)則1、計(jì)算出標(biāo)記相對(duì)于PC的偏移量offset(32位)2、將32位的offset拆分成高20位和低12位3、將偽指令call翻譯為:auipc rd,offsetHi

#offsetHi是offset的高20位jalr x1,offsetLo(rd) #offsetLo是offset的低12位子例程相關(guān)的偽指令偽指令基本指令含義callLabelauipc rd,offsetHijalr x1,offsetLo(rd)調(diào)用子例程retjalrx0,0(x1)從子例程返回(Return,ret)示例:乘法運(yùn)算計(jì)算兩個(gè)二進(jìn)制補(bǔ)碼整數(shù)的乘法,采用與十進(jìn)制乘法相同的算法以3

(-2)為例,采用4位二進(jìn)制補(bǔ)碼表示

0011(3)×

1110(-2)

0000

(0)011

(00)11

+(001)1

1010(-6)從右向左依次計(jì)算,將被乘數(shù)與0或1相乘,結(jié)果是0或保持不變Multiply子例程02行:如果乘數(shù)為0,計(jì)算任務(wù)結(jié)束03行和04行:判斷乘數(shù)最右邊一位是否為1如果是1,05行指令將被乘數(shù)加到積上06行:乘數(shù)邏輯右移1位07行:被乘數(shù)左移1位01 Multiply: andi x9,x9,0 #x9,積02 Mloop: beqz x11,Mexit #x11,乘數(shù)03 andi x8,x11,104 beqz x8,Mnext05 add x9,x9,x10 #x10,被乘數(shù)06 Mnext: srli x11,x11,107 slli x10,x10,108 j Mloop09 Mexit: ret #jalrx0,0(x1)問題:調(diào)用Multiply子例程的程序,如果使用寄存器x8存儲(chǔ)了一個(gè)數(shù)值x在執(zhí)行callMultiply指令返回后,再次使用x8做運(yùn)算,會(huì)發(fā)生什么情況?x8:在子例程中已被改為0或101 addi x10,x0,3 #x10

3,被乘數(shù)02 addi x11,x0,-2 #x11

-2,乘數(shù)03 call Multiply04 ...... #使用x8做計(jì)算05 ...... #下一個(gè)任務(wù)callee-save(被調(diào)用者保存)在子例程中完成寄存器的保存/恢復(fù)工作03行:使用數(shù)據(jù)區(qū)的4個(gè)存儲(chǔ)單元作為保存寄存器的空間01 .data02 .align 203 SaveReg1: .word 0

#保存寄存器的空間04#05 .text06 .align 207 #省略代碼,x8

x 08 addi x10,x0,3 #x10

3,被乘數(shù)09 addi x11,x0,-2 #x11

-2,乘數(shù)0A call Multiply0B ...... #使用x8做計(jì)算0C ...... #下一個(gè)任務(wù)0E和0F行:將x8的值x保存到預(yù)留的空間中18行:將x8的值恢復(fù)0D #

0E Multiply: la x5,SaveReg10F sw x8,0(x5)

#callee-save10 andi x9,x9,0 #x9,積11 Mloop: beqz x11,Mexit #x11,乘數(shù)12 andi x8,x11,113 beqz x8,Mnext14 add x9,x9,x10 #x10,被乘數(shù)15 Mnext: srli x11,x11,116 slli x10

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論