ARM彙編程式設計學習筆記(五)

2021-10-09 10:42:46 字數 2633 閱讀 6398

硬體平台:使用友善之臂mini2440平台。

軟體平台:keil

下面直接給出例子和注釋。關於使用keil的一些注意事項,以及除錯的注意事項,放在本文末給出。

area led,code,readwrite;宣告乙個**段,可讀寫,名字為led

entry ;標記下面的指令為入口點

include registermap.asmheader;包含registermap.asmheader(見下文)檔案,include偽指令的解釋詳見《arm彙編程式設計學習筆記二》

start

ldr r0,

=gpbcon; r0存放gpbcon的位址

ldr r1,

[r0]

;將r0位址中的值讀入r1中

orr r1,r1,#(

0x01

<<10)

;將r1或(

0x01

<<10)

,並將結果放入r1中

str r1,

[r0]

;將r1中值放入r0所指的位置;;

;上面一段,用於配置gpbcon暫存器

ldr r0,

=gpbup

mov r1,#0xff

; str r1,

[r0];;

;上面一段,用於配置gpbup暫存器

led_loop

ldr r0,

=gpbdat

mov r1,#0x00

str r1,

[r0]

b led_loop;跳轉到led_loop標籤所指的位址,即開始迴圈

end;源程式結尾

;;定義為本程式需要用到的三個暫存器

gpbcon equ 0x56000010

gpbdat *

0x56000014

gpbup *

0x56000018

gpbcon equ 0x56000010

gpbdat *

0x56000014

gpbup *

0x56000018

wtcon *

0x53000000

因為我們需要使用c語言,所以,我們需要定義乙個c語言的入口,按照慣例,我們將其叫做main,但是為了體現是我們手動定義的,將其命名為smain。

c語言裡面的函式,需要用到堆疊,此時我們還需要設定堆疊指標,用於指向內部4k的頂部。

為了讓其具備一定的移植性,將上面的功能單獨成乙個startup.s檔案,如下

;本檔案為2440的啟動檔案

preserve8;注意:這裡應該是需要深究的,但是因為我的開發環境已經在上傳這篇文章時被損壞,沒有細看。如果沒有記錯的話,如果去掉這句,會導致單步除錯出現問題。

area startup,code,readonly,align=3

entry

include registermap.asmheader ;包含標頭檔案

start

; ldr r0,

=wtcon

; mov r1,#0x00

;str r1,

[r0]

;關閉看門狗

ldr sp,

=1024*4

;設定sp為內部4k的頂部

bl smain ;跳轉到main程式

smain

import asm_main

;str lr,

[sp,#-4]

!;將返回位址壓入棧中

;;處理引數

bl asm_main

add sp,sp,#4

; 將棧指標指向存放返回位址的地方

ldr pc,

[sp]

,#4;pc為sp的值加4

end

那麼對應的c檔案如下

#include

"registermap_c.h"

intasm_main()

同樣的,我們便於c語言使用暫存器,也將暫存器單獨在了乙個標頭檔案中,如下:

#define 	gpbcon   (*(volatile unsigned long *)0x56000010)

#define gpbdat (*(volatile unsigned long *)0x56000014)

#define gpbup (*(volatile unsigned long *)0x56000018)

因為並不經常使用mini2440,每次都是幾個月才匆忙用一次,所以常常犯一些常識性問題,現將其記錄如下

單步除錯,需要將開關撥動到nand flash一側,否則無法進行除錯。

memory的對映一定要正確,一般從0開始,讀寫從0x30000000開始

mini2440將二進位制燒寫到nand flash時,可以使用minitools工具,該工具需要nor flash燒寫對應的軟體版本。

jflash在燒寫是需要撥動到nor flash

串列埠工具,在除錯之前需要安裝串列埠驅動,官方光碟中的驅動檔案,在win10中,執行不太好,需要重新在網上找

minitool 工具,需要android的adb驅動

arm學習筆記五 c c 與arm彙編混合程式設計

混合程式設計 常見方式 1 在c c 程式中嵌入彙編指令 語法格式 asm 2 在匯程式設計序中訪問c c 定義的全域性變數 示例 如下 test.c include int gvar 1 12 extern asmdouble void int main void test.s area asmf...

ARM彙編程式設計

arm彙編分類 目前常用的arm彙編指令有兩種 1 arm標準彙編 適用於arm公司的彙編器,適合在windows平台下使用,如ads中使用。2 gnu彙編 適用於gnu交叉編譯工具鏈中的彙編器,適合於linux開發平台。匯程式設計序的框架 section data 初始化的資料 section b...

ARM彙編學習筆記三

常規 ldr r2,r5 將r5為位址的儲存單元中的資料載入到r2中。str r1,r0,0x04 將r1中的內容存放在以 r0 0x04 的記憶體位址單元中。傳送指令型別 ldrb r3,r2 1 以r2為位址讀取乙個位元組資料到r3中。r2更新 r2 r2 1 strh r1,r0,2 半字送達...