天天看點

ARM機器碼

我們打開我們的ARM Architecture Reference Manual.pdf。這是一份很重要的資料。在第三章的第一節: 

ARM機器碼

上面就是機器碼的格式了。下面是31~28四位是條件資訊: 

ARM機器碼
ARM機器碼

Opcode指令類型的資訊:21~14位: 

ARM機器碼

下面我們就以mov指令為例,來講他的機器碼的内容。就是他對應的機器碼: 

這裡我們一下面兩條代碼:

ARM機器碼

為例:指令的詳解 

首先是反彙編:如下: 

ARM機器碼

我們通過轉變:

Mov r0,r1的機器碼0xe1a00001= 0b 1110 00 0 1101 0 0000 0000 000000000001

Moveq r0,0xff的機器碼0x03a000ff=0b 0000 00 1 1101 0 0000 0000 000011111111

上面就是兩個指令對應的機器碼:

下面是mov機器碼的格式:

ARM機器碼
ARM機器碼

我們在上面的機器碼分析中知道,後12位是表示數的大小的。可是隻有8位2進制數大小,前面四位是移位資訊位。是以表示的數最大0xff。當我們把他改為0x1ff的時候會報錯: 

ARM機器碼

這就是下來要學習的了:僞指令。

僞指令

2.僞指令定義:

僞/指令本身并沒有所對應的機器碼,它隻是在編譯的時候起作用,或者轉化為其他的實際指令來運作。

指令看似該指令執行了操作,其實他不會産生機器碼。僞指令的作用:1、它隻是在編譯的時候起作用,就像我們在C語言用#define定義一個宏一樣,隻是在編譯的時候起作用。

2、能夠起到操作的作用,是轉為其他指令運作。

一、定義類僞指令:

Global:定義一個全局的符号。

Data:定義資料段。資料存到資料段。

Ascii:字元串

Byte:位元組 

Word:字 

Equ:相當于宏定義 

Align:設定對齊。 

 代碼:

ARM機器碼

編譯的截圖: 

ARM機器碼

上圖知道:data的起始位址是500080c8:往下内容: 

ARM機器碼

上面可以看到,我們的資料已經存進了資料段了。以後,我們就可以通過标号通路資料段的資料了。 

Equ:宏定義僞指令

ARM機器碼

上面可以看到r0是0x89,宏定義成功。

Align的例子: 

我們從上面的例子知道,bh标号處的位址是500080d3,是沒有四位元組對齊的。現在我們設定他四位元組對齊: 

ARM機器碼
ARM機器碼

設定後的位址變成500080e0是能被四整除的,是四位元組對齊。 

操作類僞指令: 

Ldr的例子: 

運作結果:

ARM機器碼

由于僞指令是轉為實際的指令執行的呢? 

反彙編看看: 

ARM機器碼

他是轉化為實際的ldr存儲器指令運作的。

Nop的例子:是空操作是延時的作用。 

ARM機器碼

反彙編: 

ARM機器碼

實際的操作是mov r0,r0的操作,沒有什麼意義,隻是延時操作。 

反彙編的指令: 

arm-linux-objdump -D -S start.elf 

檢視資訊: 

arm-linux-readelf -a start.elf