<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARM子程序設(shè)計

          作者: 時間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
          程序設(shè)計時通常會把完成某一特定功能的一段程序代碼編寫成字程序,在需要的地方進行調(diào)用。ARM處理器的子程序調(diào)用是用轉(zhuǎn)移鏈接指令來實現(xiàn)的。因此,ARM處理器的子程序調(diào)用前和子程序返回時需要完成保存和恢復(fù)PC內(nèi)容的任務(wù)。

          用跳轉(zhuǎn)表實現(xiàn)子程序程序的跳轉(zhuǎn)
          例子:
          AREA Example1,CODE
          SUBMAX EQU 2
          ENTRY
          START
          MOV R0,#1
          MOV R1,#0x2F
          MOV R2,#0x10
          BL JUMPTAB
          STOP
          B STOP
          JUMPTAB
          ADR R3,SUBTAB
          CMP R0,#SUBMAX ;檢查參數(shù)的正確性
          LDRLS PC,[R3,R0,LSL #2] ;相當于switch(x)
          B ERROR
          SUBTAB ;跳轉(zhuǎn)表設(shè)置
          DCD SUB0
          DCD SUB1
          ;DCD SUB2
          SUB0 ;參數(shù)一對應(yīng)的程序段
          SUB R0,R1,R2
          MOV PC,LR
          SUB1 ;參數(shù)二對應(yīng)的程序段
          MUL R0,R1,R2
          MOV PC,LR
          ERROR ;其他參數(shù)對應(yīng)的程序段
          MOV PC,LR
          END
          程序解讀:
          1. 這個程序相當于如下C語言程序的功能,畫出流程圖
          switch(R0) //根據(jù)R0的值調(diào)用子程序
          {
          case0:
          subrout0; //R0=R1-R2
          break;
          case1:
          subrout1; //R0=R1*R2
          break;

          }


          實驗?zāi)康模赫莆?a class="contentlabel" href="http://www.ex-cimer.com/news/listbylabel/label/ARM子程">ARM子程序調(diào)用過程。
          理解序嵌套概念。


          實驗一 以字節(jié)為單位的數(shù)據(jù)塊復(fù)制程序(ARM7)
          閱讀下面程序,編寫字符串復(fù)制子程序中的代碼,實現(xiàn)程序的功能。(exp8_1.s)
          AREA STRCOPY,CODE,READONLY
          ENTRY
          START LDR R0,=SRCSTR
          LDR R1,=DSTSTR
          BL BCOPY ;字符串復(fù)制子程序調(diào)用
          STOP B STOP

          ;子程序名:BCOPY
          ;功能:以字節(jié)為單位的數(shù)據(jù)塊復(fù)制
          ;入口參數(shù):R0,R1
          ;出口參數(shù):無
          ;占用資源:R0,R1
          ;局部變量:R2
          BCOPY ;字符串復(fù)制子程序
          。。。。。。
          。。。。。。
          。。。。。。
          LTORG ;偽指令,定義數(shù)據(jù)池,在此處加地址信息,防止LDR類指令越界,
          ;通常處于無條件跳轉(zhuǎn)指令或者子程序返回指令之后
          SRCSTR DCB "1-source",0
          DSTSTR DCB "2-destination",0
          END



          答案:
          LDRB R2,[R0],#1 ;轉(zhuǎn)載1字節(jié)值并同時更新地址
          STRB R2,[R1],#1 ;存儲1字節(jié)值并同時更新地址
          CMP R2,#0 ;直到被復(fù)制字符串最后一個字符“0”為止
          BNE BCOPY
          MOV PC,LR ;復(fù)制返回地址到PC,實現(xiàn)子程序返回
          LTORG



          實驗二 累乘程序設(shè)計,計算1*2*3*…*N的值(ARM7)
          閱讀下面的程序,畫出程序的流程圖,分析程序的功能。(exp8_2_1.s)
          N EQU 4
          AREA N_MUL,CODE,READONLY
          ENTRY
          START LDR SP,=0x9000
          LDR R0,=N
          BL NMUL
          STOP B STOP
          ;子程序名:NMUL
          ;功能:累乘計算
          ;入口參數(shù):R0
          ;出口參數(shù):R0
          ;占用資源:R0
          ;局部變量:R1
          NMUL
          STMFD SP!,{R1,LR}
          MOVS R1,R0
          BEQ NMUL_ERR
          CMP R1,#10
          BHI NMUL_ERR
          CMP R1,#1
          BEQ NMUL_END
          MOV R0,#1

          NMUL_L1
          MULS R0,R1,R0
          SUBS R1,R1,#1
          BNE NMUL_L1
          B NMUL_END
          NMUL_ERR
          MOV R0,#0
          NMUL_END
          LDMFD SP!,{R1,PC}
          END



          實驗三 子程序嵌套設(shè)計(ARM9)
          閱讀下面的程序,畫出程序的流程圖,分析程序的功能。(exp8_3.s)
          AREA SUBSUB,CODE,READONLY
          ENTRY
          START
          MOV R0,#0x10
          MOV R1,#0x20
          MOV R2,#0x30
          LDR SP,=STKUSR+30*4
          BL SUB1
          STOP B STOP
          LTORG

          ;子程序名:SUB1
          ;入口參數(shù):無
          ;出口參數(shù):無
          ;局部變量:R0,R1,R2

          SUB1
          STMFD SP!,{R0-R2,LR}
          MOV R2,R0
          MOV R0,R1
          MOV R1,R2
          BL DELAY
          LDMFD SP!,{R0-R2,PC}

          DELAY
          MOV R2,#100
          DELAY_L1
          SUBS R2,R2,#1
          BNE DELAY_L1
          MOV PC,LR

          AREA MYSTACK,DATA,READWRITE
          STKUSR SPACE 30*4
          END


          關(guān)鍵詞: ARM子程

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();