x86組合語言學習記錄
x86組合語言學習記錄
0x00 前置知識
有一定程式設計基礎(會點C,java,C++,python等)。理解資訊在不同地方,意義可能不同(同一段資訊,我們可能將其看成資料,也有可能看成指令)。
0x01 學習教材及其他資源推薦
《組合語言》王爽著,清華大學出版社出版書籍。該書通俗易懂,理論和實踐緊密結合,編者也十分幽默風趣。
現在win10已把debug除錯程式移除了,因此我們需要自己安裝debug,在此推薦部落格園的一篇教程[win10環境下如何執行debug](win10環境下如何執行debug - wuliMax - 部落格園 (cnblogs.com))。
0x02 正式學習
1 基礎知識
機器語言
機器語言是機器指令的集合。電子計算機的機器指令是一串串的二進位制數碼,計算機可以通過讀入機器指令,將其轉化為高低電平,從而實現基本運算,儲存等操作。
現在PC機通過CPU(central processing unit,簡稱CPU)晶片,來實現以上功能。不同CPU,因為設計和結構的不同,所以控制指令就有所不同,即不同CPU都有自己的機器語言。
早期程式設計師為了解決機器語言的使用困難,從而開發了組合語言。
組合語言組成
- 彙編指令(機器碼的助記符)【核心】如mov。
- 偽指令(由編譯器執行)如結束符end。
- 其他符號(由編譯器識別)如+、-、*、/。
儲存器
電腦中的儲存器大致可劃分為兩大類:一類是主存,即記憶體;一類是輔存,即外存。二者的重要區別之一,就在於他們與CPU之間的物理連線方法不同。與CPU地址線直接相連的儲存器就是記憶體,而通過介面與CPU間接相連的儲存器就是外存。
PC機中的記憶體條
PC機中的硬碟(外存)
CPU、記憶體和硬碟關係
因為CPU直接連線記憶體,因此如果我們想讓CPU工作,就需要將資料和指令存放在記憶體中。
儲存器計量單位
計算機儲存資訊的最小單位,稱之為位(bit,又稱位元)。
儲存器中所包含儲存單元的數量稱為儲存容量,其計量基本單位是位元組(Byte,簡稱B),8個二進位制位稱為1個位元組,此外還有KB、MB、GB、TB等,它們之間的換算關係是1Byte=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB,1TB=1024GB。
在Intel 8086這一16位CPU中,我們常用位元組、字(兩個位元組)為計量單位。
CPU與記憶體通訊
CPU和記憶體通訊
上圖中,MAR和MDR是暫存器。前者是地址暫存器(用來儲存地址),後者是資料暫存器(用來儲存資料)。CPU將記憶體中的資料讀出後,先要放入到CPU流水線的暫存器中,再對資料進行運算處理。
同時,從上圖我們可以得知CPU和記憶體之間有三條匯流排(抽象),即資料匯流排、控制匯流排、地址匯流排。
CPU和記憶體通訊可以簡單分成三步:
1. CPU通過地址匯流排將地址資訊傳出給儲存器晶片,明確操作的儲存單元。
2. CPU通過控制匯流排發出控制命令(讀 、寫等)。
3. 儲存器和CPU通過資料匯流排傳輸資料。
匯流排
三種匯流排都有自己的寬度(物理層面可以簡單理解成每一種匯流排都由很多根電線組成)。一根線,可以傳輸一個高/低電平,因此可以代表一位元。例如,8086CPU資料匯流排有16根資料線,則8086CPU的資料匯流排寬度為16位,一次性可以傳輸1個字(兩個位元組)的資料量。
如上所述,資料匯流排的寬度決定了資料傳輸速度。而以此類推,地址匯流排寬度決定了CPU的定址能力(CPU最大能控制的記憶體大小),控制匯流排決定了CPU的控制能力(如讀、寫等)。
2 暫存器
暫存器簡介
暫存器是CPU的主要部件。可以用於暫時存放參與運算的資料和運算結果。同時,我們也可以通過改變暫存器的內容實現對CPU的控制。
8086CPU有14個暫存器,每個暫存器都有自己的名稱。這14個暫存器為:AX(accumulator)、BX(base)、CX(count)、DX(data)、SP(Stack Pointer)、BP(Base Pointer)、SI(Source Index)、DI(Destination Index)、IP(Instruction Pointer)、CS(Code Segment)、DS(Data Segment)、SS(Stack Segment)、ES(Extra Segment)、FLAG
通用暫存器
8086CPU的暫存器均為16位。AX、BX、CX、DX這四個暫存器通常用來儲存一般性的資料,被稱為通用暫存器。(注意是通常,因為它們還有其他功能)
而這些16位通用暫存器又可分為兩個獨立的8位的暫存器。
-
AX可分為AH和AL;
-
BX可分為BH和BL;
-
CX可分為CH和CL;
-
DX可分為DH和DL;
未完待續。。。