5.4 從C程序到RISC-V電子課件_第1頁
5.4 從C程序到RISC-V電子課件_第2頁
5.4 從C程序到RISC-V電子課件_第3頁
5.4 從C程序到RISC-V電子課件_第4頁
5.4 從C程序到RISC-V電子課件_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

從C程序到RISC-V示例:判斷數(shù)組中是否包含5假設(shè)整數(shù)數(shù)組x,有10個元素,i和result都是int類型變量result=0;for(i=0;i<10;i++){ if(x[i]==5){ result=1; break; }}RISC-V計(jì)算機(jī)基本類型變量寄存器數(shù)組內(nèi)存的一段連續(xù)存儲單元 .data .align 2 numbers: .word ...... #數(shù)組中的10個整數(shù) # .text .align 2 .globl main main: la x5,numbers #x5,數(shù)組起始地址 addi x9,x0,0 #x9,result

addi x8,x0,0 #x8,計(jì)數(shù)器i addi x6,x0,5 #x6,整數(shù)5 addi x28,x0,10 #x28,整數(shù)10 again: bge x8,x28,exit #i<10? lw x7,0(x5) #x[i] bne x7,x6,next #x[i]==5? addi x9,x0,1 #result=1; j exit #break; next: addi x8,x8,1 #i++; addi x5,x5,4 #x5,跟蹤下一個整數(shù)地址 j again exit: ...... #下一個任務(wù)假設(shè):計(jì)數(shù)器i:寄存器x8;result:寄存器x9數(shù)組:存儲單元0x10000000~0x10000027高級語言的一條語句可以表示為ISA上的幾條指令if(x[i]==5) ...... main: la x5,numbers #x5,數(shù)組起始地址 ...... addi x6,x0,5 #x6,整數(shù)5 ...... lw x7,0(x5) #x[i] bne x7,x6,next #x[i]==5? ......如果對數(shù)組中的元素進(jìn)行運(yùn)算,必須先將其加載到寄存器中RISC-V計(jì)算機(jī)的整數(shù)運(yùn)算指令,只能對寄存器和立即數(shù)進(jìn)行運(yùn)算 ...... main: la x5,numbers #x5,數(shù)組起始地址 ......

lw x7,0(x5)

#x[i] ...... addi x5,x5,4 #x5,跟蹤下一個整數(shù)地址for語句、if語句和break語句,都是通過條件分支和無條件跳轉(zhuǎn)實(shí)現(xiàn)的again: bge x8,x28,exit

#for(i=0;i<10;i++) ......

bne x7,x6,next

#if(x[i]==5) ......

j exit #break; ......

j again

#for(i=0;i<10;i++)示例:找一個整數(shù)的位組合中的第一個“1”假設(shè)整數(shù)是xresult=31;if(x==0){ result=-1;}else{ while(x>=0){ x=x<<1; result--; }}假設(shè)x被分配給寄存器x8,result被分配給寄存器x9while語句和if-else語句,通過條件分支和無條件跳轉(zhuǎn)實(shí)現(xiàn) addi x9,x0,31 #x9,result

beqz x8,zeroL

#if(x==0) again: bltz x8,exit

#while(x>=0) slli x8,x8,1 #x=x<<1; addi x9,x9,-1 #result--;

j again

zeroL:

addi x9,x0,-1 #result=-1; exit: ...... #下一個任務(wù)switch語句的底層實(shí)現(xiàn)switch語句,是否和級聯(lián)的if-else語句等價?intresult=0;switch(x){case1: result+=1; break;case2: result+=2;case3: result+=3; break;case4:case5: result+=5; break;default: result=0;}假設(shè)x和result分別被分配給寄存器x8和x901 .data02 .align 203 Addr: .word Default,L1,L2,L3,L4,L5 #6個起始地址04 #05 .text06 .align 207 .globl main08 main: ...... #省略代碼09 addi x9,x0,0 #result=0;0A addi x5,x0,60B bge x8,x5,Default #x>50C blt x8,x0,Default #x<00D la x5,Addr0E slli x6,x8,2 #x*40F add x5,x5,x6 10 lw x5,0(x5) #起始地址11 jr x512 L1: addi x9,x9,1 #result+=1;13 j exit #break;14 L2: addi x9,x9,2 #result+=2;15 L3: addi x9,x9,3 #result+=3;16 j exit #break;17 L4:18 L5: addi x9,x9,5 #result+=5;19 j exit #break;1A Default: addi x9,x0,0 #result=0;1B exit: ......對于switch語句,并不需要進(jìn)行多次條件判斷首先,將每個case和default的起始地址,存儲到數(shù)據(jù)區(qū)(03行)如果x的值大于5或小于0,直接跳轉(zhuǎn)到Default執(zhí)行(0A到0C行)Addr: .word Default,L1,L2,L3,L4,L5

#6個起始地址addi x5,x0,6bge x8,x5,Default

#x>5,即x>=6blt x8,x0,Default

#x<0否則,就通過switch表達(dá)式的值,在數(shù)據(jù)區(qū)查找到相應(yīng)的起始地址(0D到10行)然后,跳轉(zhuǎn)到這個地址執(zhí)行(11行) la x5,Addr slli x6,x8,2

#x*4 add x5,x5,x6 lw x5,0(x5) #起始地址 jr x5問題1、為什么switch表達(dá)式的值必須是整型,并且case后的值必須是常量?因?yàn)榫幾g器無法通過變量或非整型數(shù)實(shí)現(xiàn)以上過程問題2、break語句的含義跳出switch語句如果省略break語句,則直接進(jìn)入下一個case執(zhí)行,為什么?省略無條件跳轉(zhuǎn)指令(例:13、16和19行的偽指令jexit),則直接執(zhí)行下一條指令12 L1: addi x9,x9,1 #result+=1;13 j exit

#break;14 L2: addi x9,x9,2 #resul

溫馨提示

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

評論

0/150

提交評論