2012-08-02 92 views
21

我一直試圖使用this page以及各種其他指南來弄清楚如何以二進制和十六進制表示非常簡單的ARM指令。對我來說這似乎應該是一個簡單的過程,但我仍然不明白。這裏有幾個例子。將非常簡單的ARM指令轉換爲二進制/十六進制

基本NOP:爲他人

 what goes here?   what goes here? 
      _↓_     _____↓____ 
      | |    |   | 
mov r0, r0 ; ????00?1101????????????????????? 
         |__||__| 
          ↑ ↑ 
       how do I express registers? 

相同的基本問題。

比較兩個寄存器:

cmp r1, r0 

添加立即註冊值:

add r0, #0x1a 

所有這些教程在線是優秀的,在描述如何使用這樣的指令,但沒有,我已經能夠找到實際的步驟,通過如何將ARM指令轉換爲二進制/十六進制/機器代碼進行彙編。

在此先感謝您的幫助。

+2

很好的問題;不幸的是該鏈接已經死亡。對於路過的人來說,這裏有一個快速的[web檔案鏈接](https://web.archive.org/web/20150426195854/http://www.nyx.net/~troddis/ARM.html) – Asu 2016-11-10 22:26:22

回答

29

下面是數據處理指令是如何編碼:

ARM data processing instructions

你在你自己的網頁具有條件碼錶。寄存器編碼爲00001111

所有的例子都屬於同一類別。圖片是從我的硬盤上的某個文件中提取的,但我也設法通過google找到它。編寫這些指令是一項乏味的工作。

所以,mov r0, r0應該是這樣的:

1110 00 0 0 1101 0000 0000 00000000 

我把RN到0,因爲它實際上不是適用於MOV。在CMP的情況下,我相信,S總是1.

5

您應該得到一份ARM ARM的副本,它描述了所有指令的編碼。

大多數ARM指令使用高4位作爲條件碼。如果您不希望有條件地運行指令,則只需使用僞條件AL(1110)。

編碼中的第一個寄存器(Rn)不用於MOV指令,它應該被設置爲0000,如ARM ARM定義的。

第二個寄存器爲目標,在這裏你只是編碼登記號碼,所以你的情況,因爲你正在使用R0作爲destinal,爲R4這將是0100

的也將是0000其餘部分就是所謂的移位操作數,非常靈活。它可以是一個簡單的寄存器(r0),它只是0000 0000 0000,最後4位再次對寄存器進行編碼。它還可以對不同類型的班次進行編碼,並根據寄存器或立即值進行數據處理。

但它也可能是一個立即的8位在底部位編碼和前4位定義右旋轉2位步驟。在這種情況下,bit25也將爲1,在所有其他情況下爲0。

+5

ARM ARM是一個這是一個有趣的縮寫詞,但要做一個Google搜索很難。該擴展是'ARM體系結構參考手冊',它們可在[here](http://infocenter.arm.com/help/topic/com.arm.doc.subset.architecture.reference/index.html#reference )免費註冊後。 – 2012-08-02 22:08:48

+0

@Kevin不,擴展實際上是**高級(降低指令集計算)機器體系結構參考手冊**。但這不是一個好的谷歌搜索:) – 2014-02-14 23:26:59

9

首先,您需要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.

相關問題