你碰巧有回升是很容易看到的指令...
.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。在左臂架構,然後參考手冊,你可能不得不犧牲一個電子郵件地址。你可以谷歌手臂建築參考手冊,你可能會很幸運...
不,他們是寄存器。他們住在CPU內部。 –
某些處理器架構將其寄存器映射到通用地址空間,但AFAIK ARM不是其中之一。當然,寄存器編號需要在使用寄存器的指令中進行編碼,因此您可以將其視爲與存儲器地址空間不同的特殊(非常小的)地址空間。 – EOF
正確的ARM不是其中之一。還要注意,對於GPIO,UART等寄存器來說,處理器完全不知道什麼是處理器,程序員直接或間接地知道這些地址意味着什麼並指示處理器讀/寫它們。通用cpu寄存器r0-r15只能通過指令訪問。 –