首先來看一段**:
.global _start /* 全域性標號 */
/** 描述: _start 函式,程式從此函式開始執行此函式完成時鐘使能、
* gpio 初始化、最終控制 gpio 輸出低電平來點亮 led 燈。
*/_start:
/* 例程** */
/* 1、使能所有時鐘 */
ldr r0, =0x020c4068 /* 暫存器 ccgr0 */
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c406c /* 暫存器 ccgr1 */
str r1, [r0]
ldr r0, =0x020c4070 /* 暫存器 ccgr2 */
str r1, [r0]
ldr r0, =0x020c4074 /* 暫存器 ccgr3 */
str r1, [r0]
ldr r0, =0x020c4078 /* 暫存器 ccgr4 */
str r1, [r0]
ldr r0, =0x020c407c /* 暫存器 ccgr5 */
str r1, [r0]
ldr r0, =0x020c4080 /* 暫存器 ccgr6 */
str r1, [r0]/* 2、設定 gpio1_io03 復用為 gpio1_io03 */
ldr r0, =0x020e0068 /* 將暫存器 sw_mux_gpio1_io03_base 載入到 r0 中 */
ldr r1, =0x5 /* 設定暫存器 sw_mux_gpio1_io03_base 的 mux_mode 為 5 */
str r1,[r0]
/* 3、配置 gpio1_io03 的 io 屬性
*bit 16:0 hys 關閉
*bit [15:14]: 00 預設下拉
*bit [13]: 0 kepper 功能
*bit [12]: 1 pull/keeper 使能
*bit [11]: 0 關閉開路輸出
*bit [7:6]: 10 速度 100mhz
*bit [5:3]: 110 r0/6 驅動能力
*bit [0]: 0 低轉換率
*/ldr r0, =0x020e02f4 /*暫存器 sw_pad_gpio1_io03_base */
ldr r1, =0x10b0
str r1,[r0]
/* 4、設定 gpio1_io03 為輸出 */
ldr r0, =0x0209c004 /*暫存器 gpio1_gdir */
ldr r1, =0x0000008
str r1,[r0]
/* 5、開啟 led0
* 設定 gpio1_io03 輸出低電平
*/ldr r0, =0x0209c000 /*暫存器 gpio1_dr */
ldr r1, =0
str r1,[r0]
/** 描述: loop 死迴圈
*/loop:
b loop
咱們先不管這個**幹啥了,重點搞清楚ldr和str
ldr 主要用於從儲存載入資料到暫存器 rx 中, ldr 也可以將乙個**立即數(就是數值)**載入到暫存器 rx中,
ldr 載入立即數的時候要使用「=」,而不是「#」。
在嵌入式開發中, ldr 最常用的就是讀取 cpu 的暫存器值,
比如 i.mx6ul 有個暫存器 gpio1_gdir,其位址為 0x0209c004,我們現在要讀取這個暫存器中的資料,
ldr r0, =0x0209c004 @將暫存器位址 0x0209c004 載入到 r0 中,即 r0=0x0209c004
ldr r1, [r0] @讀取位址 0x0209c004 中的資料到 r1 暫存器中
注意這裡是從後面的位址中讀取到前面的暫存器中。第一句話中是賦值語句,將r0賦值為乙個暫存器位址值,因此可以理解是ldr to a from b
ldr 是從儲存器讀取資料,str 就是將資料寫入到儲存器中,同樣以 i.mx6ul 暫存器gpio1_gdir 為例,現在我們要配置暫存器 gpio1_gdir 的值為 0x2000002,
其自身的位址為0x0209c004
ldr r0, =0x0209c004 @將暫存器位址 0x0209c004 載入到 r0 中,即 r0=0x0209c004
ldr r1, =0x20000002 @r1 儲存要寫入到暫存器的值,即 r1=0x20000002
str r1, [r0] @將 r1 中的值寫入到 r0 中所儲存的位址中
注意這裡是從前往後寫,和ldr的讀取不同,因此可以理解是 str from a tob
ldr r0, =0x020c4068 /* 暫存器 ccgr0 */
ldr r1, =0xffffffff
str r1, [r0]
將r0賦值為0x020c4068位址值
將r1賦值為0xffffffff
將r1的值,寫入r0的儲存的位址中。
ARM linux常用彙編語法
組合語言每行的語法 lable instruction comment 段操作 section 格式 section 段名 標誌 標誌 可以是如下 a 允許段 w 可寫段 x 可執行段 常見段名 data,bss,text,rodata段,我們也可以定義我們自己的段。data 已初始化資料段 bss...
常用彙編指令
1 加減指令 2 adr指令 adr是小範圍的位址讀取偽指令,ldr是大範圍的讀取位址偽指令。可實際上adr是將基於pc相對偏移的位址值或基於暫存器相對位址值讀取的為指令,而ldr用於載入32為立即數或乙個位址到指定的暫存器中。到這兒就會看到其中的區別了。如果在程式中想載入某個函式或者某個在聯接時候...
常用彙編指令
一 資料傳輸指令 它們在存貯器和 暫存器 寄存 器和輸入輸出埠之間傳送資料.1.通用資料傳送指令.mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依...