ARM機器碼分析

2022-06-16 10:48:12 字數 2299 閱讀 1765

我們編寫的匯程式設計序還是不夠底層,cpu都是對機器碼進行操作的,所以還需要用彙編器將彙編**轉換成機器碼才能被cpu處理。下面舉幾個例子來說說分析arm機器碼的方法。

對編譯連線之後得到的elf進行反彙編:arm-linux-objdump

檢視得到的反彙編**。這裡如果想同時看到彙編**和機器碼,在編譯的時候需要加上-g除錯選項。

1、mov r1,#0xff

1110 00 1 1101 0 0000 0001 000011111111

前者是彙編**,後者是其對應的機器碼。用第乙個例子具體講一下分析的方法。首先必須具備的乙個手冊就是arm architecture reference manual。這是學習arm處理器絕對權威的乙個參考資料。先看看每種arm指令的一般格式

31--28是條件段,取值表如下所示

這裡的例子中mov後面沒有跟條件,所以是al,always (unconditional) ,對應的機器碼為1110

27--26為保留位,恒為00

25位:distinguishes between the immediate and register forms of . 

標誌shifter_operand段存放的是立即數還是暫存器。若為暫存器則置零,若為立即數則置一。

24--21為opcode,標明指令的型別,下面是opcode的取值表

這個例子中mov對應的為1101

20位:signifies that the instruction updates the condition codes.

表明該指令是否會影響程式狀態字暫存器。是則置一,否則置零

19--16位:specifies the first source operand register.

標明第乙個源運算元暫存器,見每個指令的格式,有的有rd,有的沒有。

由mov指令的一般格式可以看出,他是沒有使用rd的,所以這幾位填全0,其他使用到rn的,這幾位填通用暫存器標號的二進位制值。如r2,則為0010

15--12位:specifies the destination register. 

標明目的暫存器,填充方法同rn

11--0位:

specifies the second source operand.  

標明第二個源運算元,若為立即數則填該立即數的二進位制值,若為通用暫存器則填通用暫存器標號的二進位制值。

第一條指令的機器碼到這裡就分析完了,下面具其他幾個不同的情況來驗證上面的說法,分析方法還是一樣的,這裡就不一一分析了。

2、 movne r2,r1

0001 00 0 1101 0 0000 0010 000000000001

3、 cmp r1,r2

1110 00 0 1010 1 0001 0000 000000000010

4、 add r0,r0,r1

1110 00 0 0100 0 0000 0000 000000000001

5、 bic r0,r1,#0b101

1110 00 1 1110 0 0001 0000 000000000101

from: 

bl指令機器碼

arm64:

b:0x17向前跳轉,0x14向後跳轉

bl:0x97向前跳轉 0x94向後跳轉

(目標位址 - 指令位址)/ 4 = 偏移

// 減8,指令流水造成。

// 除4,因為指令定長,儲存指令個數差,而不是位址差。

完整指令:

.text:000000000008cc84 8d b3 ff 97 bl je_arena_malloc_hard

.text:0000000000079ab8 je_arena_malloc_hard

計算偏移:

(79ab8-8cc84) / 4 = ffffffffffffb38d

ffb38d | 0x97000000 = 97ffb38d

from:

ARM機器碼分析

我們編寫的匯程式設計序還是不夠底層,cpu都是對機器碼進行操作的,所以還需要用彙編器將彙編 轉換成機器碼才能被cpu處理。下面舉幾個例子來說說分析arm機器碼的方法。對編譯連線之後得到的elf進行反彙編 arm linux objdump 檢視得到的反彙編 這裡如果想同時看到彙編 和機器碼,在編譯的...

ARM機器碼分析

arm機器碼分析 我們編寫的匯程式設計序還是不夠底層,cpu都是對機器碼進行操作的,所以還需要用彙編器將彙編 轉換成機器碼才能被cpu處理。下面舉幾個例子來說說分析arm機器碼的方法。對編譯連線之後得到的elf進行反彙編 arm linux objdump 檢視得到的反彙編 這裡如果想同時看到彙編 ...

機器數機器碼

定點數的機器碼中零的表示形式 正數的補碼就是其本身,負數的補碼其最高位 符號位 為1,其餘各位是對原碼取反再加1。所以,對於8位二進位制數,正0的原碼 補碼就是00000000,負數的原碼是10000000,反碼為11111111,被碼是反碼加1,就是 1 00000000。其中 1 是超出8位的進...