1. 程式人生 > >組合語言學習筆記(一)-----基礎知識

組合語言學習筆記(一)-----基礎知識

一、組合語言組成

    組合語言由以下三類組成

    1)彙編指令:機器碼的助記符,有對應的機器碼;

    2)偽指令:沒有對應的機器碼,有編譯器執行,計算機並不執行

    3)其他符號:如:+、-、*、/等,由編譯器識別,沒有對應的機器碼。

二、儲存器:

    CPU從記憶體中讀取資訊,及向記憶體中寫資料。儲存器即記憶體。

三、指令和資料

    都存在磁碟或記憶體中,沒有區別,二進位制資訊

四、儲存單元

    儲存器被劃分為若干單元,每個儲存單元從0開始順序編號。例如,一個儲存器有128個儲存單元,編號從0--127.

    儲存器大小:計算機最小資訊單元bit(位元),也就是一個二進位制位。8個bit組成一個Byte(簡稱:B),也就是一個位元組。微型儲存器的儲存單元可以存放一個位元組,即8個二進位制位。一個儲存器有128個儲存單元的儲存器,他可以存放128個位元組。

四、CPU對儲存器讀寫

    專門連線CPU和其他晶片的導線,統稱為匯流排。三條匯流排:地址匯流排、控制匯流排、資料匯流排。

    1)地址匯流排:地址匯流排指定儲存器單元。一根導線可傳送兩種狀態,高、低電平。二進位制及1和0。如果一個CPU有N根地址先,則可以說CPU的地址匯流排的寬度為N。這樣的CPU最多可以尋2的N次方個記憶體單元。

    2)資料匯流排:8086有16根資料線,可一次傳輸16位資料,所以可一次傳輸資料89D8H;

    3) 控制匯流排:對系統中其他控制元件的控制能力。

五、記憶體地址空間

    例如:一個CPU的地址線寬度為10,那麼定址1024個記憶體單元,這1024個可尋到的記憶體單元就構成 這個CPU的記憶體地址空間。

    1)一些概念:主機板、介面卡、各類儲存器晶片。主要講儲存器

    一臺PC機,裝多個儲存晶片,從物理上獨立、是不同元件,從讀寫屬性上分兩類:隨機儲存器(RAM)和只讀儲存器(ROM),隨機儲存器可讀可寫,但是必須帶電儲存,關機後儲存內丟失。只讀儲存器關機後內容不丟失。

    儲存器從功能上分:

            隨機儲存器:存放CPU使用的大部分程式和資料,主隨機儲存器一般由兩個位置的RAM組成,主機板RAM和擴充套件插槽RAM;

            裝有BIOS(basic input/output system 基本輸入輸出系統) 的ROM,BIOS是由主機板和各類介面卡廠商提供的軟體系統,主機板和某些介面卡上插有儲存相應的BIOS的ROM,例如(顯示卡的ROM上儲存著顯示卡的BIOS)

            介面卡上的RAM:某些介面卡需要對大批量資料輸入輸出資料進行暫時儲存,其上裝有RAM,典型的事顯示卡上的RAM,一般稱為現存。

    2)記憶體地址空間概念

        所有屋裡儲存器被看做一個由若干儲存單元組成的邏輯儲存器,每個物理儲存器在這個邏輯儲存器彙總戰友一個地址段,及一段地址空間。CPU在這段地址空間上讀寫資料,實際上就是在相對應的屋裡儲存器中讀寫資料。

        記憶體地址空間的大小受CPU地址匯流排寬度的限制。

六、暫存器(CPU工作原理)

        1、通用暫存器:8086CPU的所有暫存器都是16位,可以存放兩個位元組。AX、BX、CX、DX四個暫存器通常用來存放一般性的資料,被稱為通用暫存器。

        8086CPU上一代CPU中的暫存器都是8位,為了保證相容性,四個通用暫存器都可以分為兩個獨立使用的8位暫存器使用:如(AX可分為AH和AL;BX可分為BH和BL.其中高8位搞成8--15位(AH/BH),低8位構成0--7位(AL/BL)).

        出於相容性考慮8086CPU可以一次性處理兩種尺寸的資料:位元組(byte,一個位元組由8個bit組成),字(記為word),一個字由兩個位元組組成,這兩個位元組分別稱為高位位元組和低位位元組。

        2.實體地址: CPU F訪問記憶體單元時,要給出記憶體單元的地址,此地址就是實體地址。

        3.  16位結果的CPU

        8086CPU有20地址匯流排,可以傳送20位地址,達到1M的定址能力。8086CPU要讀寫記憶體原理:

        1)CPU中的相關部件提供兩個16位的地址,一個稱為段地址,一個稱為偏移地址。

        2)段地址和偏移地址通過內部匯流排送入一個稱為地址加法器的部件

        3)地址加法器將兩個16位地址合成一個20位的實體地址

        4)地址加法器通過內部匯流排將20位實體地址送入輸入輸出控制電路

        5)舒鴻儒輸出控制電路將20位實體地址送上地址匯流排

        6)20位實體地址被地址匯流排傳送到儲存器。

        地址加法器採用 實體地址=段地址*16+偏移地址(段地址*16==二進位制左移4位)

        4.段暫存器

            段地址在8086CPU的段暫存器中存放,8086CPU有4個段暫存器:CS、DS、SS、ES。

            CS、IP是最關鍵的兩個暫存器,他們只是了CPU當前要讀取指令的地址。CS為程式碼段暫存器,IP為指令指標暫存器。任意時刻,CS中的內容為M,IP的內容為N,8086CPU將從記憶體M*16+N出開始,讀取一條指令並執行。

        5.修改CS、IP的指令

        MOV 指令: 傳送指令。可修改暫存器的值,但是不能設定CS、IP的值。(mov ax,123)

        jmp指令:能夠改變CS、IP的內容的指令被統稱為轉移指令。修改CS、IP的值(jmp 段地址:偏移地址)。

        jmp 合法暫存器:(jmp ax),僅修改IP的內容。可以認為類似於mov IP,ax指令,但mov不能操作IP。

        6.程式碼段

        可將長度為N(N<<64KB)的一組程式碼,存在一組地址連續、起始地址為16的位數的記憶體單元中,我們可以認為,這段記憶體是用來存放程式碼的,從而定義一個程式碼段。要讓CPU執行我們放在程式碼段中的指令,必須將CS:IP指向所定義的程式碼段中的第一條指令的首地址。

        7.實驗一

        1)用R指令檢視、改變CPU暫存器的內容

         2)用Debu的D命令檢視記憶體中的內容

         3)用Debug的E命令修改記憶體中的內容

         4)用E命令向記憶體中寫入機器碼,用U命令檢視記憶體中機器碼的含義,用T命令執行記憶體中的機器碼。

         5)用debug的a命令一彙編指令的形式在記憶體中寫入機器指令。

七、暫存器(記憶體訪問)

        1.記憶體中字的儲存:CPU中,16位暫存器來儲存一個字,高8位存放高位元組,低8位存放低位元組。記憶體單元時位元組單元(一個單元存放一個位元組),則一個字要用兩個地址連續的記憶體單元來存放。

         2.CPU讀寫記憶體單元時不必須先給出記憶體單元地址,8086CPU中記憶體地址由段地址和偏移地址組成。8086CPU中有一個DS暫存器,通常用來存放要訪問的資料的段地址。栗子:讀取10000H單元內容,執行程式如下:

mov bx,1000H;mov ds,bx;mov al,[0]   

[...]表示一個記憶體單元,[...]中的0,表示記憶體單元的偏移地址。

8086CPU不支援將資料直接送入段暫存器的操作。

        3.8086CPU提供相關的指令以棧的方式訪問記憶體空間。入棧(PUSH)和出棧(POP)都是以字為單位進行的。

            CS、IP存放當前指令的段地址和偏移地址。段暫存器SS和暫存器SP,棧頂的段地址存放在SS中,偏移地址存放在SP中,任意時刻,SS:SP只想棧頂元素,PUSH 和POP指令執行時,CPU從SS何SP中得到棧頂的地址。