接下來就讓我們進入到本章的前半部分。在前面章節中已經多次提到,計算機cpu能直接解釋執行的只有本地**(機器語言)程式。用c語言等編寫的源**,需要通過各自的編譯器編譯後,轉換成本地**。
通過調查本地**的內容,可以了解程式最終是以何種形式來執行的。但是,如果直接開啟本地**來看的話,只能看到數值的羅列。如果直接使用這些數值來編寫程式的話,還真是不太容易理解。因而就產生了這樣一種想法,那就是在各本地**中,附帶上表示其功能的英語單詞縮寫。例如,在加法運算的本地**中加上add(addition的縮寫)、在比較運算的本地**中加上cmp(compare的縮寫)等。這些縮寫稱為助記符,使用助記符的程式語言稱為組合語言。這樣,通過檢視組合語言編寫的源**,就可以了解程式的本質了。因為這和檢視本地**的源**,是同一級別的。
不過,即使是用組合語言編寫的源**,最終也必須要轉換成本地**才能執行。負責轉換工作的程式稱為彙編器,轉換這一處理本身稱為彙編。在將源**轉換成本地**這個功能方面,彙編器和編譯器是同樣的。
用組合語言編寫的源**,和本地**是一一對應的。因而,本地**也可以反過來轉換成組合語言的源**。持有該功能的逆變換程式稱為反匯程式設計序,逆變換這一處理本身稱為反彙編(圖10-1)。
圖10-1 組合語言的源**和本地**是一一對應的
哪怕是用c語言編寫的源**,編譯後也會轉換成特定cpu用的本地**。而將其反彙編的話,就可以得到組合語言的源**,並對其內容進行調查。不過,本地**變換成c語言源**的反編譯,則要比反彙編困難。這是因為,c語言的源**同本地**不是一一對應的,因此完全還原到原始的源**是不太可能的①。
ps:①通過解析可執行檔案得到源**的方式稱為「反彙編」或「反編譯」,也稱為「反向工程」。市場上銷售的軟體程式等,有時會在其使用說明書中明確表明禁止反彙編及反編譯。
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...
組合語言 微控制器基礎
以老師上課講的例題為例,進行程式分析。前兩步為跳過中斷區,一般程式都直接加上 org 0000h ljmp main org 1000h 定義源位址為1000h main mov a,30h 將 立即數30h 賦給 累加器a movc a,a pc 將 累加器a 下一條命令後程式計數器的值 對應位址...
組合語言 彙編指令
功能 用來進行資料傳輸。以 mov a,b 為例,相當於a b。具有以下形式 mov 暫存器,資料 mov 暫存器,暫存器 mov 暫存器,記憶體單元 mov 記憶體單元,暫存器 mov 段暫存器,暫存器 功能 用來做加法。以 add a,b 為例,相當於a a b。具有的形式,和 mov 一樣。功...