彙編語言學習筆記——————寄存器

CPU概述

內部總線

一個典型的CPU由運算器,邏輯控制器,寄存器等器件組成,這些器件靠內部總線相連。

內部總線與外部總線的區別

  • 內部總線實現CPU內部各個器件之間的聯繫。
  • 外部總線實現CPU和主板其他器件的聯繫。

寄存器

8086CPU有14個寄存器,他們的名稱爲:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。

通用寄存器

  • 8086CPU所有的寄存器都是16位的,可以存放兩個字節。

  • AX,BX,CX,DX通常用來存放一般性數據被稱之爲通用寄存器
    下圖是AX通用寄存器的寄存器圖:
    在這裏插入圖片描述

  • 一個16位的寄存器可以存儲一個16位的數據

  • 8086上一代CPU中的寄存器都是8位的,爲了保證兼容性,這四個寄存器都可以分爲兩個獨立的8位寄存器

    • AX可以分爲AH和AL
    • BX可以分爲BH和BL
    • CX可以分爲CH和CL
    • DX可以分爲DH和DL

8086CPU的8位寄存器存儲邏輯

以AX爲例,8086CPU的16位寄存器分爲兩個8位寄存器的情況:
在這裏插入圖片描述

  • AX的低8位構成了AL寄存器,高8位構成了AH寄存器
  • AH和AL寄存器是可以獨立使用的8位寄存器

8086CPU的數據存儲情況

在這裏插入圖片描述

寄存器 寄存器中的數據 所表示的值
AX 0100111000100000 20000(4E20H)
AH 01001110 78(4EH)
AL 00100000 32(20H)

從上表可以看出分成高8位和分成低8位與16位讀的數據在邏輯上是有所差異的。

字在寄存器中的存儲

  • 一個字可以存在一個16位寄存器中,這個字的高位字節和低位字節自然就存在這個寄存器的高8位寄存器中和低8位寄存器中。

幾條彙編指令

彙編指令不區分大小寫

彙編指令 控制CPU完成的操作 用高級語言的語法描述
MOV AX,18 將18送入AX中 AX = 18
MOV AH,78 將78送入AH AH = 78
ADD AX,8 將寄存器AX中的數值加上8 AX = AX + 8
MOV AX,BX 將寄存器中BX中的數據送入寄存器AX中 AX = BX
ADD AX,BX 將AX和BX中的內容相加,結果存放在AX中 AX = AX + BX

檢測點2.1

寫出每條彙編指令執行後相關寄存器中的值

  • MOV AX,62627 AX = F4A3H
  • MOV AH,31H AX = 31A3H
  • MOV AL,23H AX = 3123H
  • ADD AX,AX AX = 6246H
  • MOV BX,826CH BX = 826CH
  • MOV CX,AX CX = 6246H
  • MOV AX,BX AX = 826CH
  • ADD AX,BX AX = 04D8H
  • MOV AL,BH AX = 0482H
  • MOV AH,BL AX = 6C82H
  • ADD AH,AH AX = D882H
  • ADD AL,6 AX = D888H
  • ADD AL,AL AX = D810H
  • MOV AX,CX AX = 6246H

**只能使用目前學過的彙編指令,最多使用4條指令,編程計算2的4次方

MOV AX,2
ADD AX,AX
ADD AX,AX
ADD AX,AX

物理地址

  • CPU訪問內存單元要給出內存單元的地址。所有的內存單元構成的存儲空間是一個唯一的線性空間。
  • 我們將這個唯一的地址稱爲物理地址
    概括的將,16位結構描述了一個 CPU具有以下幾個方面的特徵:
  • 運算器一次性最多可以處理16位的數據
  • 寄存器的最大寬度爲16位
  • 寄存器與運算器之間的通路是16位的
    8286有20位地址總線,可傳送20位地址,尋址能力爲1M,但是8086內部爲16位結構,它只能傳送16位的地址,表現出的尋址能力只有64K,因此8086CPU必須採用一種機制解決這樣的問題,它採取的方法是在內部用兩個16位地址合成的方法來形成一個20位的物理地址,下圖是合成的方法:
    在這裏插入圖片描述
    地址加法器合成物理地址的方法:
    物理地址 = 段地址*16+偏移地址(乘以16即16進制向左移動一位,二進制數向左移動4位)
    下圖爲合成物理地址的原理
    在這裏插入圖片描述
    有兩點需要注意:
  • 段地址*16必然是16的倍數,所以一個段地址的起始地址也一定是16的倍數。
  • 偏移地址爲16位,16位地址的尋址能力爲64KB,所以一個段的長度最大爲64KB

總結

  • CPU訪問內存單元時,必須向內存提供內存單元的物理地址。

  • 8086CPU在內部用段地址和偏移地址移位相加的方法形成最終的物理地址。

  • CPU可以用不同的段地址和偏移地址實現同一個物理地址

  • 偏移地址16位,變化範圍爲0~FFFFH,僅用偏移地址來尋址最多可尋64K個內存單元

    • 給定段地址1000H,用偏移地址尋址,CPU的尋址範圍爲:10000H~1FFFFH.
  • 在8086PC機中,存儲單元的地址用兩個元素來進行描述:段地址和偏移地址。

  • “數據在21F60H內存單元中”。對於8086PC機的兩種描述:

    • 數據存在2000:1F60單元中
    • 數據存在內存的2000段中的1F60H中。

可以根據需要,將地址連續,起始地址爲16的倍數的一組內存單元定義爲一個段。

檢測點2.2

  • 給定段地址爲001H,僅通過變化偏移地址尋址,CPU的尋址範圍爲0010H到1000FH.
  • 有一組數據放在內存20000H單元中,現給定段地址爲SA,若想用偏移地址尋址到此單元。則SA應該滿足的條件是;最小爲:1001H,最大爲2000H.
    • 物理地址 = SA*16+EA
    • 20000h = SA*16+EA
    • SA = (20000H-EA)/16 = 2000H-EA/16
    • EA取最大值時,SA取最小值,2000H-FFFFH/16 = 1001H
    • EA取最小值時,SA取最大值,2000H-0H/16 = 2000H

段寄存器

段寄存器就是提供段地址的,
8086有4個段寄存器:

  • CS:代碼段寄存器
  • DS:數據段寄存器
  • SS:堆棧段寄存器
  • ES:附加段寄存器
    當8086CPU要訪問內存時,由這四個段寄存器提供內存單元的段地址。
    CS和IP是8086CPU中最關鍵的寄存器,他們指示可CPU當前要讀取指令的地址。
  • CS爲代碼段寄存器
  • IP爲指令指針寄存器

CPU讀取和執行指令的相關部件

在這裏插入圖片描述
具體過程的詳細步驟:

  1. 從CS:IP指向內存單元讀取指令,讀取的指令進入進入指令緩衝器
  2. IP = IP + 所讀取到的指令的長度,從而指向下一條指令
  3. 執行指令。轉到步驟(1),重複這個過程。

CPU工作過程的簡要描述

  • 在8086CPU加電啓動或復位後(即CPU剛開始工作時),CS和IP被設置爲CS = FFFFH,IP= 000H.
  • 即在8086PC機剛啓動時,CPU從內存FFFF0H單元中讀取指令執行。
  • FFFF0H單元中的指令是8086PC即開機後執行的第一條指令。
  • 在任何時候,CPU將CS,IP中的內容當做指令的段地址和偏移地址,用他們合成指令的物理地址,到內存中讀取指令碼,執行。
  • 如果說,內存中的一段信息曾被CPU執行過的話,它所在的內存單元必然被CS:IP指向過。

修改CS、IP的指令

  • 在CPU中,程序員能夠用指令讀寫的部件只有寄存器,程序員可以通過改變寄存器中的內容實現對於CPU的控制。
  • CPU執行指令是由CS,IP中的內容決定的,程序員可以通過改變CS、IP中的內容來控制CPU執行目標指令。
  • 8086CPU爲CS、IP提供了另外的指令來改變他們的值:轉移指令
  • 同時修改CS、IP的內容:
    • jmp 段地址:偏移地址
      • jmp 2AE3:3(最終物理地址:2AE33)
      • jmp 3:0B16(最終物理地址:0B46)
  • 功能:用指令中給出的段地址修改CS,偏移地址修改IP。
  • 僅僅修改IP的內容:
    • jmp 某一合法寄存器
      • jmp ax (類似於mov IP,ax)
      • jmp bx
        功能:用寄存器中的值修改IP

代碼段

  • 對於8086PC機,在編程時,可以根據需要,將一組內存單元定義爲一個段。
  • 可以將長度爲N(N <= 64kb)的一組代碼,存在一組地址連續、起始地址爲16的倍數的內存單元中,這一段內存是用來存放代碼的,從而定義了一個代碼段。
  • CPU只認被CS:IP指向的內存單元中的內容爲指令,因此要將CS:IP指向所定義的代碼段中的第一條指令的首地址。

總結

  • 段地址在8086CPU的寄存器中存放。當8086CPU要訪問內存時,由段寄存器提供內存單元的段地址。8086CPU有四個段寄存器,其中CS用來存放指令的段地址。
  • CS存放指令的段地址,IP存放指令的偏移地址。
  • 8086機中,任意時刻時,CPU將CS:IP指向的內容當做指令執行。
  • 8086CPU 的工作過程:
    1. 從CS:IP指向內存單元的讀取指令,讀取的指令進入指令緩衝器
    2. IP指向下一條指令
    3. 執行指令。(轉到步驟1,重複這個過程)

檢測點2.3

下面的3條指令執行後,CPU幾次修改IP?都是在什麼時候?最後IP的值是多少?
mov ax,bx
sub ax,ax
jmp ax
一共修改了四次:
第一次:讀取了mov ax,bx指令
第二次:讀取了sub ax,ax指令
第三步:讀取了jmp ax指令
第四步:執行jmp ax修改了IP內容
IP = 0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章