我們編寫的匯程式設計序還是不夠底層,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
ARM機器碼分析
arm機器碼分析 我們編寫的匯程式設計序還是不夠底層,cpu都是對機器碼進行操作的,所以還需要用彙編器將彙編 轉換成機器碼才能被cpu處理。下面舉幾個例子來說說分析arm機器碼的方法。對編譯連線之後得到的elf進行反彙編 arm linux objdump 檢視得到的反彙編 這裡如果想同時看到彙編 ...
ARM機器碼分析
我們編寫的匯程式設計序還是不夠底層,cpu都是對機器碼進行操作的,所以還需要用彙編器將彙編 轉換成機器碼才能被cpu處理。下面舉幾個例子來說說分析arm機器碼的方法。對編譯連線之後得到的elf進行反彙編 arm linux objdump 檢視得到的反彙編 這裡如果想同時看到彙編 和機器碼,在編譯的...
機器數機器碼
定點數的機器碼中零的表示形式 正數的補碼就是其本身,負數的補碼其最高位 符號位 為1,其餘各位是對原碼取反再加1。所以,對於8位二進位制數,正0的原碼 補碼就是00000000,負數的原碼是10000000,反碼為11111111,被碼是反碼加1,就是 1 00000000。其中 1 是超出8位的進...