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

2021-09-22 00:27:26 字數 1568 閱讀 4784

對於初學者來說,這個程式還是能學到很多東西的。另外,對要學彙編的同學說一句,就算是選修課做作業,也不要覺

得幾行就寫完很容易,光在紙上寫,實際執行的時候語法問題上還是很多的。我做這個作業用的是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這樣我們就完成了簡單的一位數...