1. 程式人生 > 其它 >C++ 反彙編

C++ 反彙編

技術標籤:C++

1.彙編語法

1.指令:LDR(load)

含義:讀記憶體命令

例子:

指令:LDR R0 ,[R1] --假設R1的值為x

命令解析:讀取地址x上的資料(4個位元組)儲存到R0中。

2.指令:LDR(偽指令)

含義:偽指令(並不存在的指令,最終被解析成真正的彙編指令)

例子:

LDR R0,=0x12345678

命令解析:把0x12345678的值賦值給R0

補充:偽指令的含義
一條ARM指令為 32 位 ,其中肯定是由某些位元組來表示MOV本身,某一位用來指定使用的暫存器(比如R0),剩下的位就不足32位了,如果我們需要使用命令:MOV R0 ,#0x12345678 ,此時MOV指令剩下的位已經不足32為了,所以這條指令就會出錯,所以MOV指令不能寫任意值,只能寫簡單的值(被稱為立即數)。

3.指令:STR(Srote)

含義:寫記憶體命令

例子:

指令:LDR R0 ,[R1] --假設R1的值為x

命令解析:

例子:

指令:STR R0 ,[R1] --假設R1的值為x

命令解析:把R0的值(4位元組)寫到地址x中去。

4.指令:ldm

含義:讀記憶體讀取資料,然後把讀取的資料寫入多個暫存器

命令解析:

例子:

ldmia sp, {fp, sp, pc}

假設:sp=4080

例子:ia的含義是過後增加(Increment After),就是先讀取後增加,而且的順序的依據是:高編號的暫存器儲存在高地址

fp,sp, pc 這三個的暫存器編號分別如下所示(ARM程式設計手冊檢視)

pc->R15,sp->R13,fp->R11.所以存取的順序是:fp-sp-pc(與指令順序無關)

其他形式簡單的描述指令的行為,意思分別是過後增加(Increment After)、預先增加(Increment Before)、過後減少(Decrement After)、預先減少(Decrement Before)。

5.指令:stm

含義:把多個暫存器的值寫入記憶體

例子:

指令:stmdb sp!, {fp, ip, lr, pc}

解析:假設sp=4096,db是預先減少(Decrement Before)的意思,就是先減少後存入sp開始的地址,而且存取的順序的依據是:高編號的暫存器儲存在高地址。fp, ip, lr, pc 這四個的暫存器編號分別如下所示(ARM程式設計手冊檢視)

pc->R15,lr->R14,ip->R12,fp->R11.所以存取的順序是:pc-lr-ip-fp(與順序無關)

儲存的大體如下,先減後存入:
提示:sp!的含義代表的是,sp會等於執行完此條語句後的值,比如存入四個暫存器,那麼得減掉4次,那麼sp=4096-16=4080。

其他形式簡單的描述指令的行為,意思分別是過後增加(Increment After)、預先增加(Increment Before)、過後減少(Decrement After)、預先減少(Decrement Before)。

6.指令:B

含義:跳轉指令

7.指令:BL

含義:跳轉到指定指令,把返回地址(下一條指令的地址)儲存在lr寄存裡邊

例子:

BL xx

aa

解析:命令跳轉到xx處執行,且lr暫存器儲存aa的地址,以便繼續執行

8.指令:MOV(move)

含義:賦值指令

例子1:

MOV R0,R1

命令解析:把R1的值賦值給R0

(即為:R0=R1)

例子2:

MOV R0,#0x100

命令解析:把0x100賦值給R0

9.指令:sub

含義:減法指令

例子1:

指令:sub ro ,r1,#5

解析:其含義是:r0 = r1 -5;

例子2:

指令:sub ro ,r1,r2

解析:其含義是:r0 = r1 -r2

10.指令:add

含義:加法指令

例子1:

指令:add ro ,r1,#5

解析:其含義是:r0 = r1 + 5;

指令:add ro ,r1,r2

解析:其含義是:r0 = r1 + r2;

11.指令:cmp

含義: cmp(compare)指令進行比較兩個運算元的大小

例子:例:cmp oprd1,oprd2

其含義為第一個操作減去第二個運算元,但不影響第兩個運算元的值,它影響flag的CF,ZF,OF,AF,PF.
在這裡插入圖片描述

若執行指令後:ZF=1,則說明兩個數相等,因為zero為1說明結果為0.
當無符號時:
若CF=1,則說明了有進位或借位,cmp是進行的減操作,故可以看出為借位,所以,此時oprd1<oprd2;
CF=0,則說明了無借位,但此時要注意ZF是否為0,若為0,則說明結果不為0,故此時oprd1>oprd2.
當有符號時:
若SF=0,OF=0 則說明了此時的值為正數,沒有溢位,可以直觀的看出,oprd1>oprd2;
若SF=1,OF=0 則說明了此時的值為負數,沒有溢位,則為oprd1<oprd2;
若SF=0,OF=1 則說明了此時的值為正數,有溢位,可以看出oprd1<oprd2;
若SF=1,OF=1則說明了此時的值為負數,有溢位,可以看出oprd1>oprd2;
最後兩個可以作出這種判斷的原因是,溢位的本質問題:
兩數同為正,相加,值為負,則說明溢位
兩數同為負,相加,值為正,則說明溢位
故有,正正得負則溢位,負負得正則溢位

12.指令:bne

含義: 是個條件跳轉,即:是“不相等(或不為0)跳轉指令”。如果不為0就跳轉到後面指定的地址,繼續執行

例子:

cmp    r3, #4    ; 0x4

bne    a0 <led_on+0x48>

ldr    r2, [fp, #-20]

當著兩句連用時,代表r3-4,如果結果為0,則繼續執行下面的語句ldr,如果結果不為0,則跳轉到<led_on+0x48>地址處執行。

13.指令:MRS

含義:MRS指令用於將程式狀態暫存器的內容傳送到通用暫存器中。

格式:MRS{條件} 通用暫存器,程式狀態暫存器(CPSR或SPSR)

例子:

MRS R0,CPSR @傳送CPSR的內容到R0
MRS R0,SPSR @傳送SPSR的內容到R0

注意事項:
MRS指令用於將程式狀態暫存器的內容傳送到通用暫存器中。該指令一般用在以下兩種情冴:
Ⅰ.當需要改變程式狀態暫存器的內容時,可用MRS將程式狀態暫存器的內容讀入通用暫存器,修改後再寫回程式狀態暫存器。
Ⅱ.當在異常處理或程序切換時,需要儲存程式狀態暫存器的值,可先用該指令讀出程式狀態暫存器的值,然後儲存。

14.指令:MSR

含義:MSR指令用亍將運算元的內容傳送到程式狀態暫存器的特定域中。其中,運算元可以為通用暫存器或立即數。

格式:MSR{條件} 程式狀態暫存器(CPSR或SPSR)_<域>,運算元

例子:

MSR CPSR,R0 @傳送R0的內容到CPSR
MSR SPSR,R0 @傳送R0的內容到SPSR
MSR CPSR_c,R0 @傳送R0的內容到SPSR,但僅僅修改CPSR中的控制位域

注意事項:
<域>用於設定程式狀態暫存器中需要操作的位,32位的程式狀態暫存器可分為4個域:
位[31:24]為條件標誌位域,用f表示;
位[23:16]為狀態位域,用s表示;
位[15:8]為擴充套件位域,用x表示;
位[7:0]為控制位域,用c表示;
該指令通常用於恢復或改變程式狀態暫存器的內容,在使用時,一般要在MSR指令中指明將要操作的域。

15.指令:bic

含義:BIC指令用於清除(運算元1)的某些位,並把結果放置到目的暫存器中。(運算元1)應是一個暫存器,(運算元2)可以是一個暫存器,被移位的暫存器,或一個立即數。(運算元2)為32位的掩碼,如果在掩碼中設定了某一位,則清除返一位。未設定的掩碼位保持不變。

格式:BIC{條件}{S} 目的暫存器,運算元1,運算元2

例子:

bic r0,r0,#0x1f
0x1f=0xb11111
其含義:清除r0的bit[4:0]位。

16.指令:push

push暫存器:將一個暫存器中的資料入棧

17.指令:pop

pop暫存器:出棧用一個暫存器接收資料