




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
子例程子程序現代程序設計語言的靈魂提供了抽象的能力將一個組件的功能與其實現的細節分隔開來程序員只需理解組件的結構,不需要考慮其實現的細節,就能夠把該組件作為一個程序塊使用子程序使程序員能夠以模塊化的方式寫程序,提高了構建復雜系統的能力子例程在一個程序中,多次執行某個程序片段在程序內,不必每次給出這個程序片段通過多次調用該程序片段實現子例程(Subroutine)/函數(Function,C語言)子例程機制調用/返回機制程序片段A示例程序片段A:做乘法運算的指令序列x9=x10*x11 andi x9,x9,0 #x9,積 loop: ...... #省略x9=x10*x11的實現細節 j loop exit: ...... #下一個任務調用/返回機制調用機制計算子例程的起始地址,加載到PC,并保存返回地址返回機制將返回地址加載到PC中JAL和JALR指令使用無條件跳轉指令,實現了調用/返回機制JAL:JumpandLink“PC-相對”尋址模式,計算子例程的起始地址JALR:JumpandLinkRegister“基址+偏移量”尋址模式,計算子例程的起始地址通常設置目標寄存器為x1,保存返回地址/鏈接JALPC
PC+SEXT(imm[20:0])x1PC+4地址311211760x0040000000000000110000000000000011101111
imm[20|10:1|11|19:12]x1jalJAL指令匯編格式JAL x1,LABELLABEL,標識JAL指令的目標例如,jalx1,Multiply下一條被執行的指令被Multiply標識的指令并且,在x1中保存返回地址Multiply子例程Multiply: andi x9,x9,0 #x9,積loop: ...... #省略x9=x10*x11的實現細節 j loopexit: jalr x0,0(x1)
#返回使用jalrx0,0(x1)結束子例程JALRPC
(rs1)+SEXT(imm[11:0])x1
PC+4jalr指令的匯編指令格式為jalr x1,imm12(rs1)或jalr x1,rs1,imm12地址31201915141211760x0040000011111111110000101000000011100111
imm[11:0]x5jalrx1I-類型跳轉問題:什么是JALR指令能夠提供的而JAL指令無法提供的重要特點?jal指令計算出的地址被限制于內存的一定范圍之內偏移范圍為-220到220-1jalr指令對于下一條被執行的指令位于何處沒有限制偽指令call使用JALR指令,調用子例程:如何計算子例程的起始地址,將其賦值給rs1?對于匯編程序員來說,可以使用偽指令,簡化編程工作callLabel匯編器將其翻譯為jalr指令callLabel匯編器按照內存分配的規則1、計算出標記相對于PC的偏移量offset(32位)2、將32位的offset拆分成高20位和低12位3、將偽指令call翻譯為:auipc rd,offsetHi
#offsetHi是offset的高20位jalr x1,offsetLo(rd) #offsetLo是offset的低12位子例程相關的偽指令偽指令基本指令含義callLabelauipc rd,offsetHijalr x1,offsetLo(rd)調用子例程retjalrx0,0(x1)從子例程返回(Return,ret)示例:乘法運算計算兩個二進制補碼整數的乘法,采用與十進制乘法相同的算法以3
(-2)為例,采用4位二進制補碼表示
0011(3)×
1110(-2)
0000
(0)011
(00)11
+(001)1
1010(-6)從右向左依次計算,將被乘數與0或1相乘,結果是0或保持不變Multiply子例程02行:如果乘數為0,計算任務結束03行和04行:判斷乘數最右邊一位是否為1如果是1,05行指令將被乘數加到積上06行:乘數邏輯右移1位07行:被乘數左移1位01 Multiply: andi x9,x9,0 #x9,積02 Mloop: beqz x11,Mexit #x11,乘數03 andi x8,x11,104 beqz x8,Mnext05 add x9,x9,x10 #x10,被乘數06 Mnext: srli x11,x11,107 slli x10,x10,108 j Mloop09 Mexit: ret #jalrx0,0(x1)問題:調用Multiply子例程的程序,如果使用寄存器x8存儲了一個數值x在執行callMultiply指令返回后,再次使用x8做運算,會發生什么情況?x8:在子例程中已被改為0或101 addi x10,x0,3 #x10
3,被乘數02 addi x11,x0,-2 #x11
-2,乘數03 call Multiply04 ...... #使用x8做計算05 ...... #下一個任務callee-save(被調用者保存)在子例程中完成寄存器的保存/恢復工作03行:使用數據區的4個存儲單元作為保存寄存器的空間01 .data02 .align 203 SaveReg1: .word 0
#保存寄存器的空間04#05 .text06 .align 207 #省略代碼,x8
x 08 addi x10,x0,3 #x10
3,被乘數09 addi x11,x0,-2 #x11
-2,乘數0A call Multiply0B ...... #使用x8做計算0C ...... #下一個任務0E和0F行:將x8的值x保存到預留的空間中18行:將x8的值恢復0D #
0E Multiply: la x5,SaveReg10F sw x8,0(x5)
#callee-save10 andi x9,x9,0 #x9,積11 Mloop: beqz x11,Mexit #x11,乘數12 andi x8,x11,113 beqz x8,Mnext14 add x9,x9,x10 #x10,被乘數15 Mnext: srli x11,x11,116 slli x10
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 娛樂活動策劃執行規范
- DB43-T 2878-2023 捕食性食蚜蠅繁育技術規程
- 麻醉進修試題及答案
- 生活技能試題及答案
- 福建高考試題及答案
- 地理疆域考試題及答案
- 雙城幼教考試題及答案
- 新零售環境下便利店智能化門店設計與顧客滿意度調查報告
- 2025年文化藝術經紀代理服務項目規劃申請報告
- 文化產業金融政策與2025年融資渠道拓展策略及市場機遇分析報告
- 吉林省“BEST合作體”2023?2024學年高一下學期期末考試 數學試題(含解析)
- 2025山西航空產業集團有限公司校園招聘(第一批)43人筆試參考題庫附帶答案詳解
- 2025年文物保護工程師職業資格考試試題及答案
- 2025年公共關系學考試試題及答案全解析
- 高企財務培訓課件
- (統編版2025新教材)歷史八下期末復習考點講解(1-19課)
- DB13(J)-T 8422-2021 建筑工程消能減震技術標準
- 護理給藥錯誤應急預案
- 深圳地理會考試卷及答案2024
- 2025年江西師范大學附中高三高考英語試卷試題(含答案詳解)
- T-CSTM 00149-2021 高硅奧氏體不銹鋼焊接鋼管
評論
0/150
提交評論