常用彙編語法 ldr str

2021-09-29 22:16:03 字數 2653 閱讀 7514

首先來看一段**:

.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依...