#define gpj0con 0xe0200240
ldr r0, =gpj0con //把位址值賦給暫存器r0,從後面的=可以看出用的是ldr偽指令,因為需要編譯器來判斷這個數
ldr r1, =0x11111111 //將設定的數暫存到暫存器r1中
str r1, [r0] //暫存器間接定址。功能是把r1中的數寫入到r0中的數為位址的記憶體中去
ldr(load register)指令將記憶體內容加載入通用暫存器。
str(store register)指令將暫存器內容存入記憶體空間中。
ldr/str組合用來實現 arm cpu和記憶體資料交換
c語言中訪問記憶體位址的方法如下片段。在arm中(統一編址),暫存器的位址類似於記憶體位址(io與記憶體統一編址的),所以 這裡的問題是用c語言讀寫暫存器,就是用c語言來讀寫記憶體位址。用c語言來訪問記憶體,就要用到指標
#define gpj0con 0xe0200240
unsigned int *p = (unsigned int *)gpj0con; //注意arm中常用無符號整型指標,(unsigned int *)是強制型別轉換,讓等號兩邊型別匹配
*p = 0x11111111; //解引用,間接改變gpj0con位址中存的數
可以看出,c語言間接訪問記憶體位址的方式是通過指標間接訪問。
假如定義了乙個int a;那麼直接給變數名賦值a = 5; 這樣的方式就直接訪問量記憶體位址
int a; /* 編譯器幫我們申請了1個int型別的記憶體格仔(長度是4位元組,位址是確定的,但是只有
編譯器知道,我們是不知道的,也不需要知道。),並且把符號a和這個格仔繫結。*/
a = 5; // 編譯器發現我們要給a賦值,就會把這個值5丟到符號a繫結的那個記憶體格仔中。
【擴充套件】c語言中函式:一段**的封裝。
函式名的實質:就是這一段**的首位址。所以說函式名的本質也是乙個記憶體位址。
【注意】記憶體單元格仔的編址單位是位元組。
C語言記憶體位址基礎(ZZ)
從計算機記憶體的角度思考c語言中的一切東東,是挺有幫助的。我們可以把計算機記憶體想象成乙個位元組陣列,記憶體中每乙個位址表示 1 位元組。比方說我們的電腦有 4k 記憶體,那這個記憶體陣列將會有 4096 個元素。當我們談論乙個儲存位址的指標時,就當相於我們在談論乙個儲存著該記憶體陣列某個元素索引的...
C語言記憶體位址
任務清單 c語言在記憶體中一共分為5個區域 記憶體棧區 存放區域性變數名 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,函式呼叫結束後釋放記憶體空間。通常是用於那些在編譯期間就能確定儲存大小的變數的儲存區,用於在函式作用域內建立,在離開作用域後自動銷毀的變數的儲存區。通常是區域性變數,函...
C語言基礎之 記憶體位址分配
一.記憶體劃分 位址由高到低 1.棧區 棧區的資料以棧的形式進行儲存,特點 先進後出 函式體內存放的區域性變數存放在棧區,由系統分配空間和系統釋放.開發人員不需要關心如何為區域性變數分配空間.int a 10 printf p n a 2.堆區由開發人員手動申請,手動釋放,唯一一塊由開發人員操作的區...