首先,您需要infocenter.arm.com上的ARM體系結構參考手冊(ARM ARM),參考手冊,獲取最老的一個(armv5管他呢)。該指令集在那裏有很好的定義。
二,爲什麼不只是組裝一些指令,看看會發生什麼?
;@test.s
cmp r1, r0
add r0, #0x1a
任何交叉彙編你(看到一個腳本生成的gcc目錄http://github.com/dwelch67/raspberrypi,只是跑起來直通binutils的那個腳本)
arm-none-linux-gnueabi-as test.s -o test.o
arm-none-linux-gnueabi-objdump -D test.o
臂無-Linux的gnueabi VS掰沒有精靈VS手臂精靈等不事本,都做同樣的
Disassembly of section .text:
00000000 <.text>:
0: e1510000 cmp r1, r0
4: e280001a add r0, r0, #26
前四名的完整的32位ARM指令(不是拇指)是條件碼位,見病情場部分在ARM ARM中。 0xE表示始終執行該指令。 0b0000是eq只有當z標誌被設置時才執行,0b0001 ne只在z被清除時執行。
在ARM ARM中push進入arm指令集,然後按字母順序列出arm指令,然後找到cmp它啓動與cond 00I10101 rb sbz移位器
從我們的cmp指令上面我們看到1110 000101010001 ...所以我是一個零位15:12是零位27:26是零和24:21是1010所以這是一個cmp指令
上面的第19位到第16位是0b001,這對ARM ARM中的移位器操作數是rn = 1(r1),它告訴您查看尋址模式1數據處理操作數,並在pdf中有一個鏈接頁面
我們知道我們希望第二個操作數只是一個寄存器,即所謂的數據處理操作數寄存器和一個頁碼,轉到該頁上的那個頁面15:12是11:4是0和3 :0是rm。我們從cmp指令中知道它說15:12應該是零,我想知道它是否在意,cmp不會將結果存儲到寄存器,因此不使用rd。 rm被使用,在這種情況下,我們想要r0,所以0b0000進入3:0也注意到它顯示位27:25爲零,在cmp指令中25是I,我們現在知道我們想在那裏有一個零,所以
的CMP頁面,這個數據處理之間 - 註冊頁面,我們有整個畫面
1110 condition
000
1010 opcode
1 S (store flags, that is a 1 for a cmp to be useful)
0001 rn
0000 rd/dont care/sbz
00000
000
0000 rm
cmp rn,rm
cmp r1,r0
附加類似,但採用了直接的,所以去的指令阿爾法列表中的加法指令。我們現在從cmp得知,這個類的指令是24:21是操作碼,我們可以直接轉到操作數的操作數上去繼續從這裏開始
這次我們正在做add rd,rn,#immediate
所以找頁面#immediate
和編碼是
1110 condition, always
001 (note the immediate bit is set)
0100 (opcode for add for this type of instruction)
0 (S not saving the flags, it would be adds r0,r0,#26 for that)
0000 (rn = r0)
0000 (rd = r0)
現在到了有趣的部分,我們可以編碼26種不同的方式。位7:0是立即數,位11:8允許立即旋轉,26是0x1A,我們可以簡單地將0x1A放在低8位,並將旋轉設置爲0,這就是gnu彙編器所做的。可能會在低8位中放置一個0x68,並且在rotate_imm字段1101000中向右旋轉1 1 * 2位是11010 = 0x1A = 26.
很好的問題;不幸的是該鏈接已經死亡。對於路過的人來說,這裏有一個快速的[web檔案鏈接](https://web.archive.org/web/20150426195854/http://www.nyx.net/~troddis/ARM.html) – Asu 2016-11-10 22:26:22