新聞中心

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

        ARM匯編語言源程序格式

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

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

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

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

        字符串拷貝程序設(shè)計(用LDR和STR實現(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è)計(用LDR和STR實現(xiàn))——續(xù)
        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è)計
        數(shù)據(jù)串拷貝時,若使用LDM和STM則可增加程序的效率。考慮到ARM的寄存器,一次采用8個寄存器進(jìn)行傳輸比較合適,
        通過指令: MOVS r3,r2, LSR #3 來計算需要幾輪8位數(shù)據(jù)傳送,剩余的數(shù)據(jù)個數(shù)可以通過指令A(yù)NDS r2, r2, #7 獲得,再對其進(jìn)行按字傳輸即可。

        字符串拷貝程序設(shè)計(用LDM和STM實現(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個字
        STMFD sp!, {r4-r11} ; save some working registers
        octcopy
        LDMIA r0!, {r4-r11} ; 從源串加載8個字
        STMIA r1!, {r4-r11} ; 放入目的串
        SUBS r3, r3, #1 ; 控制變量減少
        BNE octcopy ; ... 繼續(xù)

        字符串拷貝程序設(shè)計(用LDM和STM實現(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 ; 從源串加載一個字且指針自增
        STR r3, [r1], #4 ; 存儲到目的串
        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.104case.com/article/201611/319019.htm


        關(guān)鍵詞: ARM匯編語言源程序格

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 内丘县| 太原市| 贵州省| 河东区| 曲阜市| 岑溪市| 婺源县| 昭觉县| 靖宇县| 南康市| 阜康市| 石景山区| 浑源县| 北宁市| 牙克石市| 高清| 达日县| 息烽县| 镇宁| 喀什市| 石阡县| 宜宾市| 云和县| 武邑县| 修文县| 敦化市| 嘉黎县| 郎溪县| 商南县| 穆棱市| 丰顺县| 青河县| 大冶市| 青海省| 张家口市| 宣城市| 泰安市| 日照市| 大冶市| 武隆县| 周口市|