之前找win匯編的時(shí)候看到了反匯編,好奇心驅使下去查了一下反匯編是什么,這里把我之前查到的給你看看看
匯編語(yǔ)言是高級語(yǔ)言轉換成機器碼的橋梁,通過(guò)匯編語(yǔ)言的編譯轉換成機器碼,計算機就可以執行程序。因為在計算機中,所有的程序都是按照機器碼執行的,所以對匯編語(yǔ)言的理解,能夠增加對底層執行的認識。
下面介紹的是匯編語(yǔ)言編譯的過(guò)程(手工的方式編譯68HC11的子例程):
LDAA(立即尋址)指令的長(cháng)度為兩個(gè)字節,操作碼是86(這個(gè)是在計算機中的機器碼,也就是說(shuō)如果計算機存儲的數據是86,就會(huì )執行LDAA操作),另一個(gè)字節是操作碼。而ADDA(立即尋址)指令的長(cháng)度也是兩個(gè)字節。操作碼是8B,在技術(shù)手冊或程序員參考手冊中查找其余的操作碼,就對得到如下的結果:
0100 86 10 LDAA #$10 ;把第一個(gè)數載入到累加器A中
0102 8B 1F ADDA #$1F ;把第二個(gè)數加到累加器A
0104 8B 0C ADDA #$0C ;把第三個(gè)數加到累加器A
0106 B7 00 27 STAA $0027 ;把累加器A的內容存到地址0x0027中
0109 39 RTS ;返回主程序
此處,做了如下的假定:程序的起始地址是0x0100,每條指令的地址都附在左左邊。注意地址的變化與指令長(cháng)度的關(guān)系。
如果我們要明確的告訴編譯器,程序的起始地址是0x0100,則可以使用org這條偽指令語(yǔ)句:
org 0x0100
org偽指令必須始終放在第一條指令的前面,用于把程序的代碼定位在特定的位置上。例如處理器芯片的ROM上。
反匯編
反匯編就是我們把一系列的機器碼轉換成改程序的助記符。如果我們拿到一份機器碼程序,而我們想要知道他的功能和工作方式,可以對機器碼進(jìn)行反匯編。
例如,我們拿到了一份68HC11機器碼程序的字節序如下:
8E 56 78 86 56 84 06 36 4C 36
首先,我們假定第一個(gè)字節為操作碼,在Motorola (或68HC11)指令集的數據手冊里,查找0x8E這個(gè)操作碼,就會(huì )發(fā)現它是LDS(load stack pointer 加載堆載指針)指令,而該指令的長(cháng)度為3個(gè)字節(一個(gè)為操作碼,另外兩個(gè)為操作數)。因此,如果第一個(gè)字節為操作碼,則其后的兩個(gè)字節為相關(guān)的數據。所以,第一條指令就是:
8E 56 78 LDS #$5678; 把0x5678載入到堆棧指針中
后面的指令操作首先要查找到機器碼對應的操作碼,再看這個(gè)操作碼有幾個(gè)字節,然后就能夠反匯編出機器碼的程序。
聯(lián)系客服