匯編語言——寄存器(CPU的工作原理 ax,bx,cx,dx通用寄存器 cs代碼段寄存器)


寄存器

一個典型的CPU由運算器、控制器、寄存器等器件組成,這些器件靠內部總線相連。(外部總線是上一篇博客說的內存總線,數據總線,控制總線)

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

CPU中主要的部件是寄存器,寄存器是CPU中我們可以使用指令讀寫的部件(通過改變各種寄存器的內容來實現對CPU的控制)

不同的CPU寄存器的個數也不同,8086CPU有14個寄存器 它們的名稱為:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

1、通用寄存器

a.簡介

8086CPU所有的寄存器都是16位的,可以存放兩個字節。(1Byte=8bit)
AX、BX、CX、DX 通常用來存放一般性數據被稱為通用寄存器。

一個16位寄存器所能存儲的數據的最大值為:216-1

示例:

數據:20000
二進制表示:0100111000100000
在寄存器AX中的存儲:

四個寄存器都可以分為兩個獨立的8位寄存器使用。
AX可以分為AH和AL;
BX可以分為BH和BL;CX可以分為CH和CL;
DX可以分為DH和DL。

AX的低8位(0位~7位)構成了AL寄存器,高8位(8位~15位)構成了AH寄存器,它們都是可以獨立使用的8位寄存器。一個8位寄存器所能存儲的數據的最大值是28-1。

b.匯編指令

匯編指令不區分大小寫(和mysql一樣大小寫不敏感)

丟失(不進位):丟失指的是進位制不能在 8 位寄存器中保存,但是 CPU 不是並真的不丟棄 這個進位值,這個問題以后再說。

 

 2、物理地址

CPU訪問內存單元時要給出內存單元的地址。所有的內存單元構成的存儲空間是一個一維的線性空間。
每一個內存單元在這個線性空間中都有唯一的地址,這個唯一的地址稱為物理地址

16位CPU的特征:

  • 運算器一次最多可以處理16位的數據。
  • 寄存器的最大寬度為16位。
  • 寄存器和運算器之間的通路是16位的

因為8086CPU是16位的,所以它采用了一個機智的方法(地址加法器):在內部用兩個16位地址合成的方法來形成一個20位的物理地址。

小Tips:更多猛擊這里

CPU最大能查找多大范圍的地址叫做尋址能力 ,CPU的尋址能力以字節為單位 ,如32位尋址
的CPU可以尋址2的32次方大小的地址也就是4G,這也是為什么32位的CPU最大能搭配4G內
存的原因 ,再多的話CPU就找不到了。

16位寄存器,用二進制表示最小的數是0000000000000000,最大的數是1111111111111111。
換算成十進制數就是0-65535,加上零就是65536(2^16)。
也就是說一共可以存放65536個不同的地址。
每一個地址在內存中占一個字節(Byte)。
64KB = 65536byte,so 16位結構,表現出的尋址能力是64K。

20位的尋址能力:2^20/1024/1024 = 1MB

地址總線:屬於一種電腦總線 (一部份),是CPU用來溝通某些單元想要存取(讀取/寫入)電腦內存元件/地方的實體位址。更多去看上一篇博客

地址加法器合成物理地址的方法:物理地址=段地址×16+偏移地址

一個16進制的數*16(向左移1位) ==> 一個二進制(向左移4位)

舉例說明物理地址=段地址×16+偏移地址

8086CPU就是這樣一個只能提供兩張3位數據紙條的CPU。
比如我們只能通過紙條來通信,讀者問我圖書館的地址,我只能將它寫在紙上告訴讀者。
顯然我必須有一張可以容納 4 位數據的紙條才能寫下2826這個數據:

不巧的是,沒有能容納4位數據的紙條,僅有兩張可以容納3位數據的紙條。
這樣我只能以這種方式告訴讀者2826這個數據:

給它兩張紙條,讓他把第一張紙條乘以10再加上第二張紙條的值就是我們要給它的物理地址(當然我們的是16進制的)

  • 段地址

  在編程時我們可以根據需要,將若干地址連續的內存單元看作一個段,用段地址×16定位段的起始地址(基礎地址),用偏移地址定位相應段中的內存單元。

小結:

1、CPU訪問內存單元時,必須向內存提供內存單元的物理地址
8086CPU在內部用段地址和偏移地址移位相加的方法形成最終的物理地址

(1)段地址×16 必然是 16的倍數,所以一個段的起始地址也一定是16的倍數;
(2)偏移地址為16位,16 位地址的尋址能力為 64K,所以一個段的長度最大為64K。也就是說如果偏移地址都是最大64K,那么有16個段(因為20位的尋址能力為1MB)

2、CPU可以用不同的段地址和偏移地址形成同一個物理地址。

3、給定一個段地址,僅通過變化偏移地址來進行尋址,最多可以定位多少內存單元?
結論:偏移地址16位,變化范圍為0~FFFFH,僅用偏移地址來尋址最多可尋64K個內存單元。
比如:給定段地址1000H,用偏移地址尋址,CPU的尋址范圍為:10000H~1FFFFH。

4、在8086PC機中,存儲單元的地址用兩個元素來描述。即段地址和偏移地址。

“數據在21F60H內存單元中。”對於8086PC機的兩種描述:
(a)數據存在內存2000:1F60單元中;
(b)數據存在內存的2000段中的1F60H單元中。
可根據需要,將地址連續、起始地址為16的倍數的一組內存單元定義為一個段。

答案

1、給定段地址為0001H,僅通過變化偏移地址尋址,CPU的尋址范圍是0010H到1000FH

2、有一個數據存放在內存20000H單元中,現給定段地址為SA,若想用偏位地址尋到此單元,則SA應滿足,最小為1001H,最大為2000H

解:物理地址=段地址*16+偏移地址
    20000H=SA*16+偏移地址
    由於16為十進制,轉換為十六進制=10H
    最小偏移地址=0H
    最大偏移地址=FFFFH
    最小SA=(20000H-FFFFH)/10H=20000H/10H-FFFFH/10H=2000H-FFFH=1001H
    最大SA=(20000H-0H)/10H=20000H/10H-0H/10H=2000H-0H=2000H

3、當sa<1001H 或者sa>2000H  將無法尋到20000H單元

3、段寄存器

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

  •   CS(代碼段)
  •   DS(數據段)
  •   SS(堆棧段)
  •   ES(附加段)

當8086CPU要訪問內存時,由這4個段寄存器提供內存單元的段地址。

CS和IP是8086CPU中最關鍵的寄存器,它們指示了CPU當前要讀取指令的地址(其他的段+指針寄存器以后再說,)。

  • CS為代碼段寄存器;
  • IP為指令指針寄存器

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

在 8086CPU 加電啟動或復位后( 即 CPU剛開始工作時)CS和IP被設置為CS=FFFFH,IP=0000H,即在8086PC機剛啟動時,

CPU從內存FFFF0H單元中讀取指令執行,FFFF0H單元中的指令是8086PC機開機后執行的第一條指令。

CS和IP:

CPU將CS、IP中的內容當作指令的段地址和偏移地址,用它們合成指令的物理地址,到內存中讀取指令碼,執行。
如果說,內存中的一段信息曾被CPU執行過的話,那么,它所在的內存單元必然被CS:IP指向過。

修改CP和IP的指令:

在CPU中,我們能夠用指令讀寫的部件只有寄存器,我們可以通過改變寄存器中的內容實現對CPU的控制。
CPU從何處執行指令是由CS、IP中的內容決定的,程序員可以通過改變CS、IP中的內容來控制CPU執行目標指令。

那么問題來了,我們要怎樣修改CS和IP的值呢?

首先我們來思考一下,如何修改AX中的值?
mov 指令
如:mov ax,123
mov指令可以改變8086CPU大部分寄存器的值,被稱為傳送指令。
但mov指令不能改變CS、IP的值,CPU為我們提供了另外一個指令:jmp(轉移指令)

使用方法:

# 同時修改CS和IP的值
# 使用方法:jmp 段地址:偏移地址
# 功能:用指令中給出的段地址修改CS,偏移地址修改IP。

jmp 2AE3:3    # CS的地址-->3ae3 , 偏移地址 --> 0003

jmp 3:0B16    # CS的地址-->0003 , 偏移地址 --> 0b16


# 僅修改IP的內容:
# jmp 某一合法寄存器
# 功能:用寄存器中的值修改IP。

jmp ax   (類似於 mov IP,ax)    # 修改IP的值為寄存器中的值

jmp bx

內存中存放的機器碼和對應匯編指令情況: (初始:CS=2000H,IP=0000H),寫出執行順序。

答案:

(1)mov ax,6622
(2)jmp 1000:3
(3)mov ax,0000
(4)mov bx,ax
(5)jmp bx
(6)mov ax,0123H
(7)轉到第(3)步執行

小結:

1、段地址在8086CPU的寄存器中存放。當8086CPU要訪問內存時,由段寄存器提供內存單元的段地址。8086CPU有4個段寄存器,其中CS用來存放指令的段地址
2、CS存放指令的段地址,IP存放指令的偏移地址
8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行。
3、8086CPU的工作過程:

  • 從CS:IP指向內存單元讀取指令,讀取的指令進入指令緩沖器;
  • IP指向下一條指令;
  • 執行指令。(轉到步驟(1),重復這個過程。)

4、8086CPU提供轉移指令(jmp)修改CS、IP的內容。

答案:

下面3條指令執行后,CPU幾次修改IP?都是在什么時候?最后IP中的值是多少?
mov ax,bx sub ax,ax jmp ax 首先根據 代碼 我們可以看到 mov ax,bx 我們將bx的值存入ax中,暫且不管bx的值為多少我們就認為bx中有一個數據 sub ax,ax 然后我們重新給ax賦值 ax = ax - ax ,所有ax的值應該為 0 jmp ax 當jmp指令,指向的是一個通用寄存器ax,代表的意思為修改 IP 的值 IP的值為ax 即 IP 的值應為0 所以CPU只修改了1次IP 執行到 jmp ax 時 修改了 IP中的值 為 0

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM