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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編語(yǔ)言源程序格式

          ARM匯編語(yǔ)言源程序格式

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
          Semihosting 在ADS的C語(yǔ)言函數(shù)庫(kù)中,某些ANSIC的功能是由主機(jī)的調(diào)試環(huán)境來(lái)提供的,這套機(jī)制有一個(gè)專門(mén)術(shù)語(yǔ)叫Semihosting。

          Semihosting通過(guò)一組軟件中斷(SWI)指令來(lái)實(shí)現(xiàn)。
          當(dāng)一個(gè)Semihosting軟中斷被執(zhí)行時(shí),調(diào)試系統(tǒng)先識(shí)別這個(gè)SWI請(qǐng)求,然后掛起正在運(yùn)行的程序,調(diào)用Semihosting的服務(wù),完成后再恢復(fù)原來(lái)的程序執(zhí)行。
          因此,主機(jī)執(zhí)行的任務(wù)對(duì)于程序來(lái)說(shuō)是透明的。
          SWI傳遞的功能號(hào)
          (例如: semi-hosting, 使用0x123456 (ARM) or 0xAB (Thumb)

          續(xù)
          在此例中,表格jumptable中存放地是子程序地入口地址,我們把這種表格稱為跳轉(zhuǎn)表格。
          注意指令LDR PC,[R3,R0,LSL #2],執(zhí)行地操作為PC=R3+R0×4,因?yàn)楸砀裰写娣诺氐刂窞?字節(jié)地址,所以要將R0乘以4得出偏移量,再加上表格首地址,得出子程序地入口地址賦值給PC。

          字符串拷貝程序設(shè)計(jì)
          下面的例子為用ARM指令編寫(xiě)的串拷貝的例子。
          兩個(gè)數(shù)據(jù)串都放在數(shù)據(jù)段中,且用DCB偽指令定義,DCB為定義1字節(jié)或多字節(jié)內(nèi)存空間,雙引號(hào)中的字符串在內(nèi)存中是順序存放的,因此取數(shù)/存數(shù)時(shí)需要使用LDRB和STRB指令;
          若數(shù)據(jù)串是用DCD存放的,則應(yīng)使用LDR和STR指令。
          另外,例子中采用的LDRB/STRB 指令是后索引尋址方式,即尋址完成后更新地址。

          字符串拷貝程序設(shè)計(jì)(用LDR和STR實(shí)現(xiàn))
          AREA StrCopy, CODE, READONLY
          ENTRY ; 程序入口
          start
          LDR r1, =srcstr ; 初始串的指針
          LDR r0, =dststr ; 結(jié)果串的指針
          BL strcopy ; 調(diào)用子程序執(zhí)行復(fù)制
          stop
          MOV r0, #0x18 ; 執(zhí)行中止
          LDR r1, =0x20026 ;
          SWI 0x123456 ;

          字符串拷貝程序設(shè)計(jì)(用LDR和STR實(shí)現(xiàn))——續(xù)
          strcopy
          LDRB r2, [r1],#1 ; 加載并且更新源串指針
          STRB r2, [r0],#1 ; 存儲(chǔ)且更新目的串指針;
          CMP r2, #0 ; 是否為0
          BNE strcopy ;
          MOV pc,lr ;
          AREA Strings, DATA, READWRITE
          srcstr DCB "First string - source",0
          dststr DCB "Second string - destination",0
          END

          字符串拷貝程序設(shè)計(jì)
          數(shù)據(jù)串拷貝時(shí),若使用LDM和STM則可增加程序的效率。考慮到ARM的寄存器,一次采用8個(gè)寄存器進(jìn)行傳輸比較合適,
          通過(guò)指令: MOVS r3,r2, LSR #3 來(lái)計(jì)算需要幾輪8位數(shù)據(jù)傳送,剩余的數(shù)據(jù)個(gè)數(shù)可以通過(guò)指令A(yù)NDS r2, r2, #7 獲得,再對(duì)其進(jìn)行按字傳輸即可。

          字符串拷貝程序設(shè)計(jì)(用LDM和STM實(shí)現(xiàn))
          AREA Block, CODE, READONLY ; 命名
          num EQU 20 ; 設(shè)置被拷貝的字?jǐn)?shù)
          ENTRY ; 程序入口
          start
          LDR r0, =src ; r0 = 源串指針
          LDR r1, =dst ; r1 = 目的串指針
          MOV r2, #num ; r2 = 拷貝字?jǐn)?shù)
          MOV sp, #0x400 ; 設(shè)置堆棧指針 (r13)
          blockcopy
          MOVS r3,r2, LSR #3 ; 字?jǐn)?shù)/8
          BEQ copywords ; 少于8個(gè)字
          STMFD sp!, {r4-r11} ; save some working registers
          octcopy
          LDMIA r0!, {r4-r11} ; 從源串加載8個(gè)字
          STMIA r1!, {r4-r11} ; 放入目的串
          SUBS r3, r3, #1 ; 控制變量減少
          BNE octcopy ; ... 繼續(xù)

          字符串拷貝程序設(shè)計(jì)(用LDM和STM實(shí)現(xiàn))——續(xù)
          LDMFD sp!, {r4-r11} ;
          copywords
          ANDS r2, r2, #7 ; 奇數(shù)字被拷貝
          BEQ stop ; No words left to copy ?
          wordcopy
          LDR r3, [r0], #4 ; 從源串加載一個(gè)字且指針自增
          STR r3, [r1], #4 ; 存儲(chǔ)到目的串
          SUBS r2, r2, #1 ; 字控制變量減少
          BNE wordcopy ; 繼續(xù)
          stop
          MOV r0, #0x18 ; 執(zhí)行中止
          LDR r1, =0x20026 ;
          SWI 0x123456 ;
          AREA BlockData, DATA, READWRITE
          src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
          dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
          END

          本文引用地址:http://www.ex-cimer.com/article/201611/319019.htm


          評(píng)論


          技術(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); })();