1. 程式人生 > 其它 >x86組合語言學習記錄

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都有自己的機器語言。

​ 早期程式設計師為了解決機器語言的使用困難,從而開發了組合語言。

組合語言組成

  1. 彙編指令(機器碼的助記符)【核心】如mov。
  2. 偽指令(由編譯器執行)如結束符end。
  3. 其他符號(由編譯器識別)如+、-、*、/。

儲存器

電腦中的儲存器大致可劃分為兩大類:一類是主存,即記憶體;一類是輔存,即外存。二者的重要區別之一,就在於他們與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和記憶體通訊

​ 上圖中,MARMDR是暫存器。前者是地址暫存器(用來儲存地址),後者是資料暫存器(用來儲存資料)。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;

未完待續。。。