《彙編語言》 筆記

第一章 基礎知識

計算機中有專門鏈接CPU和其餘芯片的導線,一般稱爲總線。從邏輯上分爲:地址總線、控制總線、數據總線。html

CPU和內存通信的過程:shell

  • CPU經過地址線將地址信息發出;
  • CPU經過控制線發出內存讀、寫命令;
  • 內存經過數據線將對應數據送入CPU或將數據存儲在對應位置。

地址總線的寬度決定CPU的尋址能力。編程

數據總線的寬度決定單次的數據傳送量。markdown

控制總線的寬度決定CPU對其餘器件的控制能力。架構

存儲器芯片分爲隨機存儲器(RAM)和只讀存儲器(ROM)。CPU在操控它們的時候,把它們總的看做一個由若干存儲單元組成的邏輯存儲器,這就是咱們所說的內存地址空間。app

第二章 寄存器

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

  • 運算器進行信息處理;
  • 寄存器進行信息存儲;
  • 控制器控制各類器件工做;
  • 內部總線鏈接各類器件,傳送數據。

寄存器是CPU中能夠用指令讀寫的部件,咱們經過改變寄存器中的內容來實現對CPU的控制。svg

8086CPU

8086CPU是16位結構的CPU,結構特性有:spa

  • 運算器一次最多能夠處理16位數據;
  • 寄存器最大寬度位16位;
  • 寄存器和運算器以前的通路爲16位。

也就是說,在8086內部,可以一次性處理、傳輸、暫時存儲的信息最大長度爲16位。操作系統

8086CPU是16位架構,可是地址總線有20位,給出物理地址的方法:

  • CPU內的相關部件提供兩個16位地址,段地址和偏移地址;
  • 段地址和偏移地址經過內部總線進入地址加法器,被合成爲一個20位的物理地址;
  • 地址加法器經過內部總線將20位物理地址送入輸入輸出控制電路,而後送上地址總線,到達存儲器。

物理地址=段地址 × 16 + \times16+ 偏移地址。

8086機內存地址空間分配基本狀況:00000-9FFFF是主存儲器地址空間;A0000-BFFFF是顯存地址空間;C0000-FFFFF是各種ROM地址空間。

段寄存器

段寄存器是CPU中提供段地址的部件,8086CPU有4個段寄存器:CS、DS、SS、ES,且不容許將數據直接送入段寄存器,必須用其餘寄存器進行中轉。

代碼段寄存器

CS爲代碼段寄存器,IP爲指令指針寄存器。在任意時刻,設CS中內容爲M,IP中內容爲N,8086CPU將從內存 M × 16 + N M\times16+N 單元(或者稱爲CS:IP指向的內容)開始讀取並執行指令。所以8086CPU的工做過程能夠描述以下:

  • 從CS:IP指向的內存單元讀取指令,並將指令送入指令緩衝器;
  • IP=IP+指令長度,從而指向下一條指令;
  • 執行指令,回到步驟1。

初始時,CS=FFFFH,IP=0000H,FFFF0H單元中的指令時8086PC機開機後執行的第一條指令。

jmp指令用來修改CS、IP的內容。

同時修改CS、IP的內容:jmp 2AE3:3執行後:CS=2AE3H,IP=0003H。

用某個寄存器中的值修改IP:jmp ax

Debug用法

r:查看寄存器;r ax能夠改變ax的值。

d:查看內存;d E1:4320查看對應地址的內存,從該地址開始列出128個字節的內容;d A:B C查看段A:B-A:C的內存( B < C B<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=SP-2,指向新的棧頂;
  • 將ax中的數據送入SS:SP指向的內存單元處。

入棧過程當中,棧頂從高地址先低地址方向增加。

當棧空時,SP指向棧底下面的內存單元。

pop ax的過程:

  • 將SS:SP中的數據送入ax中;
  • SP=SP+2,指向新的棧頂。

若是將10000H~1FFFFH看成棧段,初始狀態下SP=0。

執行mov ss,...時其後邊的指令會當即執行,且必須是mov sp,...,這麼規定便於控制棧段大小,防止有子程序調用時出錯。

第四章 彙編程序

可執行文件包含兩部分:

  • 程序(由彙編指令翻譯獲得的機器碼)和數據(源代碼中定義的數據);
  • 相關描述信息(程序大小,佔用內存等)。

彙編語言源程序中,包含兩種指令,彙編指令和僞指令。

tst.asm 編譯( m a s m \xrightarrow{編譯(masm)} tst.obj 鏈接( l i n k \xrightarrow{鏈接(link)} tst.exe c o m m a n d 加載入內存 \xrightarrow{command加載入內存} CPU運行。

操做系統的外殼

DOS中有一個程序command.com,稱爲命令解釋器,也就是DOS系統的shell。若是用戶想要執行一個程序,則輸入該程序的名稱,command首先找到該文件,而後將其加載入內存,設置CS:IP指向程序的入口,此後command中止運行,由CPU運行程序。

DOS系統中.exe文件的加載過程

  • 找到一塊容量足夠的,起始地址的偏移地址爲0的空閒內存區(起始地址爲SA:0000);
  • 在這段內存區的前256個字節中建立一個稱爲程序段前綴(PSP)的數據區,DOS經過PSP來和程序通信;
  • 接着裝入程序,地址爲SA+10H:0;(PSP區與程序區物理地址連續,可是段地址不一樣)
  • 將該內存區的段地址存入ds中,將CS:IP指向程序的入口。

所以每次將程序載入內存後,ds都比cs小10H。

相關文章
相關標籤/搜索