<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM匯編語(yǔ)言源程序格式

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

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

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


在此例中,表格jumptable中存放地是子程序地入口地址,我們把這種表格稱(chēng)為跳轉表格。
注意指令LDR PC,[R3,R0,LSL #2],執行地操作為PC=R3+R0×4,因為表格中存放地地址為4字節地址,所以要將R0乘以4得出偏移量,再加上表格首地址,得出子程序地入口地址賦值給PC。

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

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

字符串拷貝程序設計(用LDR和STR實(shí)現)——續
strcopy
LDRB r2, [r1],#1 ; 加載并且更新源串指針
STRB r2, [r0],#1 ; 存儲且更新目的串指針;
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í),若使用LDM和STM則可增加程序的效率??紤]到ARM的寄存器,一次采用8個(gè)寄存器進(jìn)行傳輸比較合適,
通過(guò)指令: MOVS r3,r2, LSR #3 來(lái)計算需要幾輪8位數據傳送,剩余的數據個(gè)數可以通過(guò)指令ANDS r2, r2, #7 獲得,再對其進(jìn)行按字傳輸即可。

字符串拷貝程序設計(用LDM和STM實(shí)現)
AREA Block, CODE, READONLY ; 命名
num EQU 20 ; 設置被拷貝的字數
ENTRY ; 程序入口
start
LDR r0, =src ; r0 = 源串指針
LDR r1, =dst ; r1 = 目的串指針
MOV r2, #num ; r2 = 拷貝字數
MOV sp, #0x400 ; 設置堆棧指針 (r13)
blockcopy
MOVS r3,r2, LSR #3 ; 字數/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 ; ... 繼續

字符串拷貝程序設計(用LDM和STM實(shí)現)——續
LDMFD sp!, {r4-r11} ;
copywords
ANDS r2, r2, #7 ; 奇數字被拷貝
BEQ stop ; No words left to copy ?
wordcopy
LDR r3, [r0], #4 ; 從源串加載一個(gè)字且指針自增
STR r3, [r1], #4 ; 存儲到目的串
SUBS r2, r2, #1 ; 字控制變量減少
BNE wordcopy ; 繼續
stop
MOV r0, #0x18 ; 執行中止
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://dyxdggzs.com/article/201611/319019.htm


評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>