請編寫乙個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...