程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> ARM匯編實現簡單的加法運算

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

編輯:匯編語言

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

得幾行就寫完很容易,光在紙上寫,實際運行的時候語法問題上還是很多的。我做這個作業用的是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在內,如果不用條件碼,那就是很多判斷語句嵌入其中,代碼真的會冗長低效,以上是我所能寫出的最簡代碼,這個程序讓

我了解到條件碼和狀態寄存器搭配使用的絕妙之處,希望同學習匯編的同志們互相交流。

本文出自 “驿落黃昏” 博客,請務必保留此出處http://yiluohuanghun.blog.51cto.com/3407300/1078140

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved