7.3 操作系統(tǒng)服務(wù)例程_第1頁
7.3 操作系統(tǒng)服務(wù)例程_第2頁
7.3 操作系統(tǒng)服務(wù)例程_第3頁
7.3 操作系統(tǒng)服務(wù)例程_第4頁
7.3 操作系統(tǒng)服務(wù)例程_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

操作系統(tǒng)服務(wù)例程輸入字符服務(wù)例程01 kbcr: .word 0xFFFF0000 #KBCR的內(nèi)存映射地址02 kbdr: .word 0xFFFF0004 #KBDR的內(nèi)存映射地址03 …… #省略04 #x10=12,輸入字符服務(wù)例程05 getc: addi x2,x2,-4 #x2,棧指針06 sw x7,0(x2) #callee-save07 la x5,kbcr 08 InPoll: lw x6,0(x5) #測試是否有字符被輸入09 lw x7,0(x6) 0A andi x6,x7,1 0B beqz x6,InPoll #如果KBCR[0]==0,輪詢0C la x5,kbdr 0D lw x6,0(x5) 0E lw x11,0(x6) #將KBDR中的數(shù)據(jù)加載到x11中07~0E行:采用輪詢方式的輸入字符指令序列x11中包含了從鍵盤輸入的字符的ASCII碼0F csrrw x5,mepc,x010 addi x5,x5,411 csrrw x0,mepc,x5 #mepc<-mepc+412 lw x7,0(x2) #恢復(fù)寄存器13 addi x2,x2,414 lw x6,0(x2)15 addi x2,x2,416 lw x5,0(x2)17 addi x2,x2,418 mret #從自陷返回0F~11行:mepc

mepc+418行:從自陷返回注意:從鍵盤輸入的字符并不會(huì)顯示在顯示器上寄存器保存/恢復(fù)05~06行,12~17行采用callee-save(被調(diào)用者保存)策略的寄存器保存和恢復(fù)寄存器x5,x6和x7的值被修改,需要保存和恢復(fù)注意:在自陷處理例程開頭,已經(jīng)將x5和x6的值壓棧保存,在此服務(wù)例程中,只需要將x7的值壓棧即可輸出字符服務(wù)例程01 dcr: .word 0xFFFF0008 #DCR的內(nèi)存映射地址02 ddr: .word 0xFFFF000C #DDR的內(nèi)存映射地址03 …… #省略04 #x10=11,輸出字符服務(wù)例程05 putc: addi x2,x2,-4 #x2,棧指針06 sw x7,0(x2) #callee-save07 la x5,dcr 08OutPoll: lw x6,0(x5) #測試顯示是否就緒09 lw x7,0(x6) 0A andi x6,x7,1 0B beqz x6,OutPoll #如果DCR[0]==0,輪詢0C la x5,ddr 0D lw x6,0(x5) 0E sw x11,0(x6) #將x11中的數(shù)據(jù)寫到DDR中0F csrrw x5,mepc,x010 addi x5,x5,411 csrrw x0,mepc,x5 #mepc<-mepc+412 lw x7,0(x2) #恢復(fù)寄存器13 addi x2,x2,414 lw x6,0(x2)15 addi x2,x2,416 lw x5,0(x2)17 addi x2,x2,418 mret #從自陷返回輸出字符串服務(wù)例程系統(tǒng)調(diào)用號:x10=4,要輸出的字符串起始地址位于x11中標(biāo)志控制的循環(huán):遇到了字符x00輸出字符串服務(wù)例程01 puts: addi x2,x2,-4 #x2,棧指針02 sw x7,0(x2) #callee-save03 addi x2,x2,-404 sw x8,0(x2)05 addi x2,x2,-406 sw x11,0(x2)07 #對字符串中的每一個(gè)字符進(jìn)行循環(huán)08 loop: lb x8,0(x11) #取得下一個(gè)字符

09 beqz x8,Return #如果是0,字符串結(jié)束0A #輪詢輸出0B la x5,dcr 0COutPoll: lw x6,0(x5) #測試顯示是否就緒0D lw x7,0(x6) 0E andi x6,x7,1 0F beqz x6,OutPoll #如果DCR[0]==0,輪詢10 la x5,ddr 11 lw x6,0(x5) 12 sw x8,0(x6) #將x8中的數(shù)據(jù)寫到DDR中13 addi r11,r11,1 #指針加114 j loop 0B~12行:采用輪詢方式的輸出字符指令序列13行:每輸出一個(gè)字符,x11中的值加1,指向下一個(gè)單元15 #從自陷返回16 Return: csrrw x5,mepc,x017 addi x5,x5,418 csrrw x0,mepc,x5 #mepc<-mepc+419 lw x11,0(x2) #恢復(fù)寄存器1A addi x2,x2,41B lw x8,0(x2) 1C addi x2,x2,41D lw x7,0(x2) 1E addi x2,x2,41F lw x6,0(x2)20 addi x2,x2,421 lw x5,0(x2)22 addi x2,x2,423 mret注意:當(dāng)字符串輸出結(jié)束,x11的值指向字符串末尾的x00使用callee-save(被調(diào)用者保存)策略05~06行,19~1A行:將寄存器x11進(jìn)行保存和恢復(fù)返回到調(diào)用程序后,x11仍然指向字符串開頭輸入字符串服務(wù)例程系統(tǒng)調(diào)用號:x10=8輸入的字符串以換行符結(jié)束存儲(chǔ)空間起始地址位于x11中,存儲(chǔ)空間的大小位于x12中服務(wù)例程的返回值是實(shí)際存儲(chǔ)的字符串的長度(在x10中)注:換行符被存儲(chǔ)到字符串末尾輸入字符串服務(wù)例程標(biāo)志控制的循環(huán):遇到了換行符,或存儲(chǔ)空間已滿輸入字符串服務(wù)例程01 gets: addi x2,x2,-4 #x2,棧指針02 sw x7,0(x2) #callee-save03 addi x2,x2,-4 04 sw x8,0(x2) 05 addi x2,x2,-4 06 sw x11,0(x2) 07 #是否遇到換行,或存儲(chǔ)空間已滿08 addi x10,x0,0 #x10,返回的字符串長度09 addi x8,x0,0 #x8,輸入的字符0A loop: beq x10,x12,Return #x10==x12||x8=='\n'0B addi x7,x0,100C beq x8,x7,Return0D #輪詢輸入字符0E la x5,kbcr 0F InPoll: lw x6,0(x5) #測試是否有字符被輸入10 lw x7,0(x6) 11 andi x6,x7,1 12 beqz x6,InPoll #如果KBCR[0]==0,輪詢13 la x5,kbdr 14 lw x6,0(x5) 15 lw x8,0(x6) #將KBDR中的數(shù)據(jù)加載到x8中0E~15行:采用輪詢方式的輸入字符指令序列16 #存儲(chǔ)字符,為下一個(gè)做準(zhǔn)備17 sb x8,0(x11)18 addi x11,x11,119 addi x10,x10,11A j loop1B #從自陷返回1C Return: csrrw x5,mepc,x01D addi x5,x5,41E csrrw x0,mepc,x5 #mepc<-mepc+41F lw x11,0(x2) #寄存器恢復(fù)20 addi x2,x2,421 lw x8,0(x2) 22 addi x2,x2,423 lw x7,0(x2) 24 addi x2,x2,425 lw x6,0(x2)26 addi x2,x2,427 lw x5,0(x2)28 addi x2,x2,429 mret #從自陷返回注意:當(dāng)字符串輸入結(jié)束,x11的值指向字符串末尾使用callee-save(被調(diào)用者保存)策略05~06行,1F~20行:將寄存器x11進(jìn)行保存和恢復(fù)返回到調(diào)用程序后,x11仍然指向字符串開頭寄存器的保存/恢復(fù)一個(gè)寄存器的值,在該寄

溫馨提示

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

評論

0/150

提交評論