《彙編語言》(王爽) 小結

 

(初稿)

 

1. 指令和數據 

這是在應用上的概念,其實都是二進制數據, cpu通過控制總線獲得的數據是指令, 通過數據總線獲得的是數據。

所有運算都是在cpu中進行的, cpu如何執行內存中的指令?  CS:IP中存放了指令所在的內存地址, 通過地址總線定位,讀取指令數據,並在cpu中執行。

簡單理解計算機: cpu+外設,cpu通過地址總線尋址外部設備。

 

2. 地址總線、數據總線、控制總線。 

尋址[1] 數據交換[2] 器件選擇/讀寫指令[3]

 

3. 總線

一類、若干條導線的集合。

 

4. 內存空間映射

主板: 通過總線(和cpu總線不是同一個東西)連接各項外設,諸如 cpu,memory, slot等

接口卡: cpu 不能對外設進行直接控制(如顯示器, 音像等),直接控制這些設備的是插在擴展插槽上的接口卡。cpu與擴展插槽通過總線相連,通過控制它來間接控制外設。

memory IC: 1. 隨機存儲RAM(應該是常見的內存條)裝在主板和擴展插槽上。 2. 裝有BIOS的ROM(主板BIOS, 顯卡BIOS, 網卡BIOS等) 3. 接口卡上的RAM,如顯存。

 

這些設備物理上獨立, 但從cpu的角度上來看, 他們都是內存,只是地址範圍不同,操作不同範圍的內存,可能就是對不同的設備進行操作。

8086地址總線20條,尋址能力應該是1MB。

 

5. 寄存器

寄存器有兩種,段寄存器和普通寄存器。普通寄存器用於存儲cpu計算過程中的中間數據,段寄存器用於存儲cpu定製化的一些數據,比如下一條指令的內存地址, 棧段空間地址。

sreg 不能被直接賦值,只能通過reg中轉。

 

6. 彙編尋址方法

cpu的地址總線是20位的,而寄存器只有16位,因此採用段地址*16 + 偏移地址的方法獲得20位地址。  非常重要,尋找某個內存單元的數據都是通過這個方法。

 

7. 段的概念

內存物理上沒有分段, 只是由於cpu的尋址方式,使得我們可以用分段的方法來管理內存。

根據編程的需要,可以將一段連續的內存空間劃分爲一個段, 用段地址 * 16定位段的起始地址, 用偏移地址來定位段中的內存單元。

 

8. CS,IP----指令

兩者合作指示了當前cpu要讀取的指令的地址。CS爲段寄存器(通常指向我們寫的代碼的首地址), IP爲指針寄存器(偏移)。

沒有提供直接修改段寄存器的指令, 但可以通過jmp。

 

9. 編程中段的概念

9.1. 數據段 存放我們要用到的數據

9.2. 代碼段 存放代碼

9.3. 棧段   棧數據。

9.4. 通過僞指令指示這幾種段。

 

10. DS [idata]

訪問內存空間的方法, 通過DS指示數據段基址,通過[...]訪問段內數據。

eg: mov ax, [5]  == mov ax, DS:[5]

 

11. SS,SP----棧。

共同定位棧段數據, SS:IP== SS*16 + IP。

當push數據時, 棧頂向低地址發展。

任意時刻, SS:IP指向棧頂元素,當棧爲空時, 指向棧段起始地址+2

 

12. 尋址方法進階 

[bx/di/si], [idata], [bx/di/si+idata], ds:/cs:/es:/ss:[...](這個被稱爲段前綴), [bx+si/di], [bx+si/di+idata],通過他們靈活實現尋址,很適合數組訪問應用。

(注意, si/di不能被拆分成8位)

 

13. cx的默認作用, 用來作爲判斷條件。

eg: loop, jcxz, 都需要用到cx

 

14. 明確指令要處理的數據長度

(1)通過寄存器名指定, eg: mov ax,1 ==> word, mov al,1 ==> byte

(2)在沒有寄存器名存在的情況下,用操作符X ptr指明內存單元的長度。X可以爲word或byte。

eg: mov word ptr ds:[1], 1 ==>word, mov byte ptr ds:[1], 1 ==>byte

 

15. 轉移: 短轉移, 長轉移

jmp short <tag>(只使用了IP)

jmp far <tag> ( 使用了CS和IP)

jmp word

 

16. BIOS基本概念

計算機有許多外設,想象每個外設都在其rom裏固化了一套程序,並將其統一編址至內存中。cpu通過尋址執行相應外設在內存中的程序,就能夠控制相應外設。

 

17. pc啓動過程

。加電後,CS=0FFFFH, IP=0,自動從FFFF:0開始執行程序,此處有一條跳轉程序, 將控制權交給BIOS,執行硬件系統檢測以及

初始化程序

。硬件檢測及初始化完成後,開始系統引導,調用int 19h中斷:尋找啓動盤,如果選擇從軟盤啓動,計算機自動檢測軟盤的0面0磁道,如果發現它以0xaa55結束,則Bios認爲它是一個引導扇區(Boot sector),將其加載至內存0000:7c00,並跳轉至該地址,執行這段引導代碼,並從此將控制權由BIOS交給操作系統,也即啓動操作系統。

引導代碼最前頭要加上一條“org 07c00h”,就是告訴編譯器, 該代碼在0x7c00處執行, 段基址就是0x7c00. 可以試一下把7c00改成0000, 看會有什麼問題。

 

18. BootSector和Bootloader

個人認爲兩者只是應用環境不同, 一個是在PC機下,一個是在嵌入式環境下。

而且嵌入式環境下通常不像PC下有BIOS, 所以此整個系統的加載啓動任務就完全由BootLoader來完成。

 

19. 默認段寄存器

 

BX,SI,DI這3個默認ds段寄存器

BP這默認ss段寄存器

AX,CX,DX,SP這4個不能用來尋址,所以哪個段寄存器也不默認。
20. RAM簡單理解爲內存條,專門用於存放數據,易擦寫修改,ROM簡單理解爲存指令的地方,不易擦寫。

21. 寄存器的用途很明確: 保存上下文信息, 中間數據。 eg: CS:IP定義了下一條要執行的指令的內存地址。
SS:IP定義了棧段的位置。
22. 經常看到: 將控制權交給xxx。 意思就是跳轉到xxx, 執行xxx部分的代碼。
23. 執行指令放在內存RAM中, 在cpu外面怎麼執行它呢? 
cpu通過3總線與RAM連接, 控制總線打開片選開關, 地址總線定位代碼地址, 數據總線取指令字節數據, 取得指令後, 在cpu中執行。
24. 實模式下, 代碼中的標號是什麼意思? 初步理解是: 段內偏移。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章