一直對彙編不感冒的我,為了學好arm
裸機開發,我再次學習組合語言和指令,值得高興的是今天看著資料自己編寫出了自己的第乙個匯程式設計序。用彙編實現1加到
100的和,源**如下:
;i為迴圈因子
sum為總和變數
; for(i=0; i<10; i++)
; { sum+=i;
; 設sum為r0
,i為r1 (i
、sum
均為無符號整數)
area reset,code,readonly ; 宣告**段
sum
entry ; 標識程式入口
code32 ; 宣告32位
arm指令
start
mov r0,#0 ; 初始化
sum的值
mov r1,#0 ; 設定
i=0
my_for cmp r1,#100 ; 判斷
i<100?
bhs for_end ; r1>=100,退出迴圈
add r1,r1,#1 ; 迴圈體,
i++
add r0,r0,r1 ; sum+=i
b my_for
for_end nop
nopb for_end
end
area
語法格式:
area 段名 屬性
1 ,屬性2 ,
……
area偽指令用於定義乙個**段或資料段
屬性字段表示該**段(或資料段)的相關屬性,多個屬性用逗號分隔。 —
code
屬性:用於定義**段,預設為
readonly
。
— data
屬性:用於定義資料段,預設為
readwrite
。
— readonly
屬性:指定本段為唯讀,**段預設為
readonly
。
— readwrite
屬性:指定本段為可讀可寫,資料段的預設屬性為
readwrite
。
entry
語法格式:
entry
entry偽指令用於指定匯程式設計序的入口點。
area init ,
code
,readonly
entry ; 指定應用程式的入口點
gbla test ; 宣告乙個全域性的數學變數,變數名為
test1
test seta 0x3 ; 將變數
test1
賦值為3,
注意書寫格式,需要頂格寫
; equ偽指令
count equ 0x30003100 ; 定義乙個變數,位址為
0x30003100
結束的時候一般讓程式停在這也就是死迴圈
outb out
nopend
keil和arm裸機開發及組合語言遇到的一些問題
原因是啟動檔案中棧設定的太小了,尤其是開大陣列的時候要注意。這個錯誤具體表現一種情況為,程式試圖對指定ram範圍之外的位址進行讀寫,sp暫存器的值也在ram範圍之外,那麼顯然是棧分配太小了。啟動 裡可以看到6種堆疊,一般修改usr stack size的值就可以了。同時也要注意堆設定的大小,程式設計...
ARM裸機從零開始的學習2 基礎概念
arm裸機從零開始的學習2 基礎概念 參考朱有鵬arm裸機全集 1 嵌入式的系統的構成特點和演進方向 1 專用,軟硬體可裁剪可配置 2 低功耗,高可靠性 高穩定性 3 軟體 短小精悍 4 可固化 可以燒錄到韌體裡面去 5 實時性 嵌入式系統的實時性是要求很高的,ucos 6 弱互動性,很多學生都喜歡...
彙編學習筆記001 基礎概念和知識
1.所有儲存器的每個儲存單元都從0開始 2.cpu對資料的讀寫,必須有三類資訊互動 器件的選擇,讀或寫的命令 控制資訊 讀或寫的資料 資料資訊 3.匯流排在邏輯上劃分為 位址匯流排,資料匯流排,控制匯流排 4.乙個字是兩個位元組 byty 乙個位元組是8bit,一bit乙個二進位制數 引言其實就是廢...