《組合語言》學習筆記——暫存器
阿新 • • 發佈:2022-03-17
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位結構
- 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指向的內容。