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

上面就是機器碼的格式了。下面是31~28四位是條件資訊:
Opcode指令類型的資訊:21~14位:
下面我們就以mov指令為例,來講他的機器碼的内容。就是他對應的機器碼:
這裡我們一下面兩條代碼:
為例:指令的詳解
首先是反彙編:如下:
我們通過轉變:
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機器碼的格式:
我們在上面的機器碼分析中知道,後12位是表示數的大小的。可是隻有8位2進制數大小,前面四位是移位資訊位。是以表示的數最大0xff。當我們把他改為0x1ff的時候會報錯:
這就是下來要學習的了:僞指令。
僞指令
2.僞指令定義:
僞/指令本身并沒有所對應的機器碼,它隻是在編譯的時候起作用,或者轉化為其他的實際指令來運作。
指令看似該指令執行了操作,其實他不會産生機器碼。僞指令的作用:1、它隻是在編譯的時候起作用,就像我們在C語言用#define定義一個宏一樣,隻是在編譯的時候起作用。
2、能夠起到操作的作用,是轉為其他指令運作。
一、定義類僞指令:
Global:定義一個全局的符号。
Data:定義資料段。資料存到資料段。
Ascii:字元串
Byte:位元組
Word:字
Equ:相當于宏定義
Align:設定對齊。
代碼:
編譯的截圖:
上圖知道:data的起始位址是500080c8:往下内容:
上面可以看到,我們的資料已經存進了資料段了。以後,我們就可以通過标号通路資料段的資料了。
Equ:宏定義僞指令
上面可以看到r0是0x89,宏定義成功。
Align的例子:
我們從上面的例子知道,bh标号處的位址是500080d3,是沒有四位元組對齊的。現在我們設定他四位元組對齊:
設定後的位址變成500080e0是能被四整除的,是四位元組對齊。
操作類僞指令:
Ldr的例子:
運作結果:
由于僞指令是轉為實際的指令執行的呢?
反彙編看看:
他是轉化為實際的ldr存儲器指令運作的。
Nop的例子:是空操作是延時的作用。
反彙編:
實際的操作是mov r0,r0的操作,沒有什麼意義,隻是延時操作。
反彙編的指令:
arm-linux-objdump -D -S start.elf
檢視資訊:
arm-linux-readelf -a start.elf