簡單的ARM彙編 二)

2021-09-24 21:45:35 字數 1530 閱讀 1757

請編寫乙個arm資料塊拷貝組合語言程式,將記憶體中的源資料塊的內容拷貝到目標位址。假設r0已經存放了源資料的首位址(自定),r1存放了目標資料位址(自定),r2存放了資料塊的總長度100(資料的個數,每個資料都是32位的,即4個位元組)。

用3個暫存器實現資料塊的拷貝,利用ldmia指令實現從源位址中取資料,利用stmia指令實現往目標位址中寫資料,利用迴圈操作實現多個資料的拷貝。

1.  首先給暫存器r0、r1和r2賦初始值(暫存器r0存放源資料首位址,r1存放目標資料位址,r2存放資料的總長度即要拷貝資料的個數)。

mov r0,#0x70000000        ;r0源資料的首位址

mov r1,#0x10000000        ;r1目標資料位址

mov r2,#100               ;r2資料塊的總長度

2. 執行ldmia操作,一次讀出4個資料放入暫存器r3-r6中。再執行stmia操作,將讀取的r3-r6中的值寫入目標記憶體單元中。

ldmia r0!,         ;r3-r6暫存器讀取源資料的內容

stmia r1!,         ;將r3-r6中的內容拷貝到目標資料位址中

3 .  要拷貝的資料個數做sub操作減4,若不等於0,則跳轉至步驟2做迴圈操作,直至要拷貝的資料個數為0,結束。

sub r2,r2,#4                    

cmp r2,#0

bne loop

乙個資料佔四個位元組,100個資料,400個位元組,400用16進製表示為190h

ldmia和stmia指令都是操作後暫存器位址自動增加的。

源位址中資料見圖3,拷貝後目標位址中資料見圖4

圖2 拷貝結束後,r0、r1中的位址

圖3源位址中的資料

圖4 拷貝後目標位址中資料

源程式:

area f,code,readonly

export reset_handler   

reset_handler

mov r0,#0x70000000        ;r0源資料的首位址

mov r1,#0x10000000        ;r1目標資料位址

mov r2,#100               ;r2資料塊的總長度

loop

ldmia r0!,             ;r3-r6暫存器讀取源資料的內容

stmia r1!,             ;將r3-r6中的內容拷貝到目標資料位址中

sub r2,r2,#4                    

cmp r2,#0

bne loop

end

ARM彙編實現簡單的加法運算

對於初學者來說,這個程式還是能學到很多東西的。另外,對要學彙編的同學說一句,就算是選修課做作業,也不要覺 得幾行就寫完很容易,光在紙上寫,實際執行的時候語法問題上還是很多的。我做這個作業用的是keil的realview mdk測 試,arm9平台。題目 將記憶體中從0x400800開始的100個字資...

ARM學習之ARM指令與彙編 二

偽操作是arm組合語言源程式中的特殊指令助記符,其作用是為了完成匯程式設計序做各種準備工作的,指示匯程式設計序對組合語言源程式的編譯操作。是編譯器執行的指令,而不是arm處理器執行的指令。1 用於定義全域性變數的gbla gbll和gbls。2 用於定義區域性變數的lcla lcll和lcls。3 ...

一段簡單的ARM彙編分析

假設 段.text首位址為0x8054 錯誤的 示例 text code 32 global start start bl main 1.pc 0x8054,lr 0x0 b main push 2.pc 0x805c,lr 0x8058 bl func1 3.pc 0x8060,lr 0x8058...