1. 程式人生 > 其它 >《組合語言》學習筆記——暫存器

《組合語言》學習筆記——暫存器

0x02 暫存器

  • CPU的組成
    • 運算器:資訊處理;
    • 暫存器:資訊儲存;
    • 控制器:控制各種器件執行;
    • 內部匯流排:連線各種器件,完成資料傳輸。

內部匯流排實現CPU內部器件之間的聯絡,外部匯流排完成CPU和主機板上其他器件的聯絡。

  • 對於彙編程式設計師來說,CPU的主要部件是暫存器,是可以通過指令讀寫的。

2.1 通用暫存器

8086CPU的所有暫存器都是16位的,可以存放2個位元組。

  • AX、BX、CX、DX通常用來存放一般性的資料,稱為通用暫存器
  • 由於上一代CPU的暫存器都是8位的,故通用暫存器都可以分為兩個獨立使用的8位暫存器。

2.2 字在暫存器中的儲存

  • 8086CPU可以一次性處理兩種尺寸
    的資料。
    • 位元組:可以存在8位暫存器中。
    • 字:可以存在16位暫存器中。

2.3 幾條彙編指令

彙編指令 控制CPU完成的操作
mov ax, 18 將18送入ax
mov ah, 78 將78送入ah
add ax, 8 將ax中的資料加上8
mov ax, bx 將bx中的資料送入ax
add ax, bx 將ax和bx中的資料相加送入ax

彙編指令和暫存器名稱不分大小寫

  • 特殊情況
    • add到16位暫存器溢位時,只保留16位;
    • add到8位暫存器溢位時,只保留8位。
      • 即使是低位也不會將溢位部分保留到高位
      • 此時低位暫存器和高位暫存器是獨立的
        ,沒有關係。

兩個操作物件的位數必須相同。

2.4 實體地址

  • 所有記憶體單元構成一維線性空間,每個記憶體單元在其中有唯一的地址,稱其為實體地址
  • CPU通過匯流排傳送實體地址之前,需要先在內部形成這個實體地址。
    • 不同的CPU有不同的形成方式。

接下來討論如何在8086CPU內部形成記憶體單元的實體地址。

2.5 16位結構的CPU

  • 16位結構表示的特性。
    • 處理:運算器一次最多處理16位的資料;
    • 儲存:暫存器最大寬度為16位;
    • 傳輸:暫存器和運算器之間通路為16位。

2.6 8086CPU給出實體地址的方法

  • 8086CPU有20位地址匯流排,但又是16位結構

    (只能發出16位的地址)。

    • 8086CPU內部使用兩個16位地址合成的方法來形成一個20位的實體地址
  • 8086CPU讀寫記憶體過程。

    • CPU的部件提供兩個16位的地址:段地址和偏移地址
    • 段地址和偏移地址通過內部匯流排送入地址加法器
    • 地址加法器將兩個16位的地址合成為一個20位的實體地址
    • 地址加法器通過內部匯流排將實體地址送入輸入輸出控制電路
    • 輸入輸出控制電路通過地址匯流排傳送到記憶體。
  • 地址加法器中採用實體地址=段地址*16+偏移地址的方法。

2.7 實體地址=段地址*16+偏移地址 的本質含義

  • 本質含義
    • CPU在訪問記憶體時,用一個基礎地址(段地址*16)和一個相對於基礎地址的偏移地址相加,給出記憶體單元的實體地址
    • 等價於:實體地址=基礎地址+偏移地址

2.8 段的概念

  • 記憶體是沒有分段的,分段的概念來自CPU

基礎地址=段地址*16,故一個段的起始地址(不是段地址)一定是16的倍數

偏移地址只有16位,故一個段最大為64KB

2.9 段暫存器

  • 段地址是放在段暫存器中的。
    • 8086CPU中為CS、DS、SS、ES,訪問記憶體時由這4個段暫存器提供記憶體單元的段地址

2.10 CS和IP

  • CS和IP指示了當前讀取指令的地址
    • CS是程式碼段暫存器,IP是指令指標暫存器
    • 當前指令的實體地址為CS*16+IP
  • 8086CPU的工作過程可以簡要概述如下:
    • 將CS和IP的值送入地址加法器計算出指令的實體地址
    • 根據實體地址從記憶體中取出指令,經過輸入輸出控制電路送入指令緩衝器
    • 此時IP+=所讀指令的長度,使得CS:IP指向下一條指令;
    • 指令被送入執行控制器執行。
  • 8086CPU剛啟動時,CS=FFFFH,IP=0000H,即第一條指令在FFFF0H單元中

記憶體中的資訊是否為指令,取決於其是否被CS:IP指向。

2.11 修改CS、IP的指令

  • 程式設計師可以改變CS、IP的內容,以控制CPU執行目標指令
  • mov指令被稱作傳送指令,可以修改大部分暫存器的值
    • 但是不能用於修改CS、IP,因為8086CPU沒有提供這樣的功能。
  • 能夠修改CS、IP內容的指令被統稱為轉移指令,例如jmp。
    • 若想同時修改CS和IP的內容,可用jmp 段地址:偏移地址
    • 若只想修改IP的內容,可用形如jmp 某一合法暫存器
jmp 2AE3:3;	CS修改為2AE3,IP修改為3
jmp bx;		CS不變,IP修改為BX中的值

2.12 程式碼段

  • 程式碼段邏輯意義上用於存放機器碼的連續記憶體單元。
    • 邏輯意義意味著CPU並不關心其是否為指令,它只認CS:IP指向的內容。