2017-06-01 123 views
0

我的問題特定於手臂皮質M3微控制器。微控制器上的每個外設都是內存映射的,這些內存地址用於處理。編譯器/彙編程序如何理解處理器內核寄存器?

例如:GPIOA-> ODR = 0;
這將在地址0x4001080C處寫入0。 該地址在微控制器的特定設備文件中定義。

現在,皮質M3有處理器內核寄存器R0-R12(通用)。我想知道,這些寄存器是否也有像其他外設一樣的地址?

所以,如果我有指令:MOV R0,#10;
將R0翻譯成某個地址時組裝?核心寄存器是否具有專用於核心外設的特殊數字地址?任何文件中定義的R0的地址(我找不到任何),就像GPIOA的地址一樣?還是寄存器R0和其他內核寄存器僅被稱爲R0及其各自的名稱,以便彙編器看到「R0」並從中產生操作碼?

我有這個困惑,因爲一些8位控制器也有通用寄存器的地址。

感謝,
納文

+0

不,他們是寄存器。他們住在CPU內部。 –

+3

某些處理器架構將其寄存器映射到通用地址空間,但AFAIK ARM不是其中之一。當然,寄存器編號需要在使用寄存器的指令中進行編碼,因此您可以將其視爲與存儲器地址空間不同的特殊(非常小的)地址空間。 – EOF

+1

正確的ARM不是其中之一。還要注意,對於GPIO,UART等寄存器來說,處理器完全不知道什麼是處理器,程序員直接或間接地知道這些地址意味着什麼並指示處理器讀/寫它們。通用cpu寄存器r0-r15只能通過指令訪問。 –

回答

1

寄存器像R0 - R12SPPC ..是CPU核心內部寄存器,它們沒有被映射到全局地址空間。只能從彙編程序訪問這些寄存器。

而且還不能直接訪問像C這樣的高級語言的核心寄存器,因爲它們不可尋址。這些寄存器用於內部處理,它們對程序員來說是透明的。

但像GPIOA-> ODR這樣的寄存器映射到全局地址空間,所以每個寄存器都有自己的地址。

0

通用寄存器用於執行CPU的通用操作。這就像我們在任何編程語言中使用幾個臨時變量一樣。因此,如果我們將這與您的問題聯繫起來,那麼CPU需要很少的保留內存段來完成它的基本操作。因此,將此分享給外部世界是沒有意義的。這就是基於ARM的處理器的工作原理。

0

你碰巧有回升是很容易看到的指令...

.thumb 

mov r0,#10 
mov r1,#10 
mov r2,#10 
mov r3,#10 
mov r4,#10 
mov r5,#10 
mov r6,#10 
mov r7,#10 

總合,然後拆開看機器代碼

Disassembly of section .text: 

00000000 <.text>: 
    0: 200a  movs r0, #10 
    2: 210a  movs r1, #10 
    4: 220a  movs r2, #10 
    6: 230a  movs r3, #10 
    8: 240a  movs r4, #10 
    a: 250a  movs r5, #10 
    c: 260a  movs r6, #10 
    e: 270a  movs r7, #10 

會有取決於三個或四個位在指令和指令集上(arm vs thumb(然後是thumb2擴展))來指定寄存器。在這種情況下,這些位碰巧與機器代碼指令的十六進制表示很好地對齊,因此我們可以看到0到7.對於cortex-m3,許多拇指指令僅限於r0-r7(意味着3位字段在指令內)有一個或兩個在下限和上限之間移動,thumb2擴展允許更多地訪問完整的r0-r15(因此在指令中將有一個4位字段)。你應該得到與cortex-m3相關的armv7m體系結構參考手冊(在獲得cortex-m3技術參考手冊並查看它使用armv7m體系結構後),還可以獲得最早的armv5體系結構參考手冊它具有最老的拇指指令集描述,它是所有手臂核心之間兼容的一個工具集合,armv6m覆蓋了cortex-m0,它具有很少的thumb2擴展,然後armv7m覆蓋cortex-m3 m4和m7,它們的數量更多thumb2擴展。

另一個例子是隻需要一秒鐘嘗試

.thumb 

mov r0,r0 
mov r1,r1 
mov r2,r2 
mov r3,r3 
mov r4,r4 
mov r5,r5 
mov r6,r6 
mov r7,r7 

mov r0,r0 
mov r1,r0 
mov r2,r0 
mov r3,r0 
mov r4,r0 
mov r5,r0 
mov r6,r0 
mov r7,r0 

Disassembly of section .text: 

00000000 <.text>: 
    0: 1c00  adds r0, r0, #0 
    2: 1c09  adds r1, r1, #0 
    4: 1c12  adds r2, r2, #0 
    6: 1c1b  adds r3, r3, #0 
    8: 1c24  adds r4, r4, #0 
    a: 1c2d  adds r5, r5, #0 
    c: 1c36  adds r6, r6, #0 
    e: 1c3f  adds r7, r7, #0 
    10: 1c00  adds r0, r0, #0 
    12: 1c01  adds r1, r0, #0 
    14: 1c02  adds r2, r0, #0 
    16: 1c03  adds r3, r0, #0 
    18: 1c04  adds r4, r0, #0 
    1a: 1c05  adds r5, r0, #0 
    1c: 1c06  adds r6, r0, #0 
    1e: 1c07  adds r7, r0, #0 

注意didnt十六進制值前排隊作爲很好的位,不事關看二進制看到三位從指令更改爲指令。

在這種情況下,彙編器選擇使用一個附加代替MOV的

注:

編碼:此指令編碼爲ADD Rd,Rn將,#0。

操作數的限制:如果和 H1 == 0和H 2 == 0)被指定一個低位寄存器,結果是不可預知的。

所有這些加上您在閱讀文檔時學到的更多東西。 http://infocenter.arm.com。在左臂架構,然後參考手冊,你可能不得不犧牲一個電子郵件地址。你可以谷歌手臂建築參考手冊,你可能會很幸運...