計算機中有專門鏈接CPU和其餘芯片的導線,一般稱爲總線。從邏輯上分爲:地址總線、控制總線、數據總線。html
CPU和內存通信的過程:shell
地址總線的寬度決定CPU的尋址能力。編程
數據總線的寬度決定單次的數據傳送量。markdown
控制總線的寬度決定CPU對其餘器件的控制能力。架構
存儲器芯片分爲隨機存儲器(RAM)和只讀存儲器(ROM)。CPU在操控它們的時候,把它們總的看做一個由若干存儲單元組成的邏輯存儲器,這就是咱們所說的內存地址空間。app
一個典型的CPU由運算器、控制器、寄存器等器件構成,這些器件靠內部總線相連。ide
寄存器是CPU中能夠用指令讀寫的部件,咱們經過改變寄存器中的內容來實現對CPU的控制。svg
8086CPU是16位結構的CPU,結構特性有:spa
也就是說,在8086內部,可以一次性處理、傳輸、暫時存儲的信息最大長度爲16位。操作系統
8086CPU是16位架構,可是地址總線有20位,給出物理地址的方法:
物理地址=段地址 偏移地址。
8086機內存地址空間分配基本狀況:00000-9FFFF是主存儲器地址空間;A0000-BFFFF是顯存地址空間;C0000-FFFFF是各種ROM地址空間。
段寄存器是CPU中提供段地址的部件,8086CPU有4個段寄存器:CS、DS、SS、ES,且不容許將數據直接送入段寄存器,必須用其餘寄存器進行中轉。
CS爲代碼段寄存器,IP爲指令指針寄存器。在任意時刻,設CS中內容爲M,IP中內容爲N,8086CPU將從內存 單元(或者稱爲CS:IP指向的內容)開始讀取並執行指令。所以8086CPU的工做過程能夠描述以下:
初始時,CS=FFFFH,IP=0000H,FFFF0H單元中的指令時8086PC機開機後執行的第一條指令。
jmp
指令用來修改CS、IP的內容。
同時修改CS、IP的內容:jmp 2AE3:3
執行後:CS=2AE3H,IP=0003H。
用某個寄存器中的值修改IP:jmp ax
。
r
:查看寄存器;r ax
能夠改變ax的值。
d
:查看內存;d E1:4320
查看對應地址的內存,從該地址開始列出128個字節的內容;d A:B C
查看段A:B-A:C的內存(
)。
e A:B x y z...
:從A:B開始日後修改改寫內存內容;也能夠提問式修改e A:B
,回車後會從A:B開始八個一行地提問;內容能夠用「」括起來直接用字符串修改內存的內容。
u A:B
:將從A:B開始的內存中的機器碼轉換爲彙編指令;u A:B C
用法與d
指令相似。
t
:從CS:IP開始執行指令。
a A:B
:從A:B開始寫入彙編指令。
內存中字的存儲:CPU的寄存器是16位,因爲內存單元都是字節單元(8位),所以用兩個地址連續的內存單元來存放一個字,字的低位字節存放在低地址單元,高位字節存放在高地址單元。由此提出字單元的概念:存放一個字形數據(16位)的內存單元,由兩個地址連續的內存單元組成。咱們將起始地址爲N的字單元簡稱爲N地址字單元。
DS存放CPU要訪問的數據的段地址。
mov bx,1000
mov ds,bx
mov al,[0]
複製代碼
以上代碼將內存1000:0中的讀取到al中。將寄存器中的數據存儲到內存中同理:mov [0],al
。
不能夠直接將當即數存放到內存中。
al和bl作加法,僅看做8位加法,多出來的進位要捨棄。
8086CPU提供相關的指令來以棧的方式訪問內存空間,所以能夠將一段內存看成棧來使用。出棧、入棧操做都以字爲單位。
棧頂是低位地址,棧底是高位地址,字型數據入棧時遵循正常存入內存單元時的規則。
push ax
pop ax
複製代碼
分別是將ax中的數據入棧和將棧頂元素彈出並存入ax中。
段寄存器SS和寄存器SP,SS:SP指向棧頂元素。push ax
的過程:
入棧過程當中,棧頂從高地址先低地址方向增加。
當棧空時,SP指向棧底下面的內存單元。
pop ax
的過程:
若是將10000H~1FFFFH看成棧段,初始狀態下SP=0。
執行mov ss,...
時其後邊的指令會當即執行,且必須是mov sp,...
,這麼規定便於控制棧段大小,防止有子程序調用時出錯。
可執行文件包含兩部分:
彙編語言源程序中,包含兩種指令,彙編指令和僞指令。
tst.asm tst.obj tst.exe CPU運行。
DOS中有一個程序command.com,稱爲命令解釋器,也就是DOS系統的shell。若是用戶想要執行一個程序,則輸入該程序的名稱,command首先找到該文件,而後將其加載入內存,設置CS:IP指向程序的入口,此後command中止運行,由CPU運行程序。
所以每次將程序載入內存後,ds都比cs小10H。