得幾行就寫完很容易,光在紙上寫,實際執行的時候語法問題上還是很多的。我做這個作業用的是keil的realview mdk測
試,arm9平台。 題目:將記憶體中從0x400800開始的100個字資料相加,其結果存於r3、r2中(r3中為高32位)。 分析:看起來很簡單有木有!!假象啊,假象,一上手才知道涉及到很多細節內容,比如讀儲存器,迴圈計數,加法溢位,
還要注意是100個字資料,每個字32位(arm9中)。單獨說這三個關鍵點很容易想到,ldr——讀儲存器內容;add——加法;
b——跳轉實現迴圈。但是光著三點是遠遠不夠的,下面貼上我寫的**分享一下:
area code, code, readonly ;宣告**段entry
code32
start mov r0, #0x0 ;置r0初值為0,雖然除錯模擬是是置為0,但是要考慮實際情況
mov r4, #count ;r4裡儲存迴圈次數
ldr r1, =start ;將初始儲存器位址放到r1中
loop ldr r0, [r1, #step]! ;將r1中位址裡的資料放到r0中,並且r1自增乙個步長,指向下乙個32位字資料
adds r2, r0, r2 ;r2+=r0,低32位累加到r2中,並修改狀態暫存器,就是當出現加法溢位時,c置位
adccs r3, r3, #0x0 ;加法溢位時,即c = 1時,r3+=c,即溢位的高位累加到r3中
subs r4, #0x1 ;計數器減一,並修改狀態暫存器,若當r4減為0時,狀態暫存器位z置零
bne loop ;迴圈次數未達到時,即檢查狀態暫存器位z = 0時,結束迴圈,否則跳轉到迴圈開頭
area data, data, readonly ;宣告資料段
start equ 0x400800
step equ 0x10
count equ 100
end
暫存器及變數使用說明: r0:每次從儲存器讀出來的資料放到r0; r1:儲存下乙個將要讀取的儲存器的位址; r2:儲存計算結果低32位(包括中間結果); r3:儲存計算結果高32位(包括中間結果); r4:儲存迴圈次數; 三個變數的設定是為了程式有更好的擴充套件性, start:儲存器起始位址 step:每次讀取儲存器後,r1向後移動步長,這個值是固定的0x10就是移動32位; count:迴圈次數 程式說明: 這個程式本來可以寫的更複雜一點,比如用到mrs去取狀態暫存器,通過與或移位等操作判斷c、z等狀態位的值,但是這樣顯然
增加了**的複雜度。為了減少**量,我增加了很多條件碼,可以看到,迴圈部分幾乎每句都是條件碼。條件碼,顧名思義,
有if在內,如果不用條件碼,那就是很多判斷語句嵌入其中,**真的會冗長低效,以上是我所能寫出的最簡**,這個程式讓
我了解到條件碼和狀態暫存器搭配使用的絕妙之處,希望同學習彙編的同志們互相交流。
簡單的彙編加法
擼 data segment str1 db please input f data 10 定義字串,用來輸出提示資訊 str2 db 0ah,0dh,please input s data 10 str3 db 0ah,0dh,result is data ends code segment as...
簡單的ARM彙編 二)
請編寫乙個arm資料塊拷貝組合語言程式,將記憶體中的源資料塊的內容拷貝到目標位址。假設r0已經存放了源資料的首位址 自定 r1存放了目標資料位址 自定 r2存放了資料塊的總長度100 資料的個數,每個資料都是32位的,即4個位元組 用3個暫存器實現資料塊的拷貝,利用ldmia指令實現從源位址中取資料...
位運算 實現加法
用位運算實現加法也就是計算機用二進位制進行運算,32位的cpu只能表示32位內的數,這裡先用1位數的加法來進行,在不考慮進製的基礎上,如下 1 1 01 0 1 0 1 10 0 0很明顯這幾個表示式可以用位運算的 來代替,如下 1 1 01 0 1 0 1 10 0 0這樣我們就完成了簡單的一位數...