組合語言學習點滴

2021-06-08 04:28:36 字數 3834 閱讀 3405

8086cpu

1、暫存器(14個16位暫存器):ax、bx、cx、dx、si、di、sp、bp、ip、cs、ss、ds、es、psw

通用暫存器:ax(ah 和 al)、bx(bh 和 bl)、cx(ch 和 cl)、dx(dh 和 dl)

源變址暫存器:si(source index)

目的變址暫存器:di(destination index)

棧指標暫存器:sp(stack pointer)

基址指標暫存器:bp(base pointer)

指令指標暫存器:ip(instruction pointer)

**段暫存器:cs(code segment)

棧段暫存器:ss(stack segment)

資料段暫存器:ds(data segment)

附加段暫存器:es(extra segment)

程式狀態字暫存器:psw

2、關於段(segment)

**段:用來存放**的一段記憶體,長度不大於64kb,位址連續,起始位址為16的倍數

三類定義的段沒有什麼區別,只是一種標識。

3、記憶體定址

記憶體位址(位址匯流排20根,支援1mb定址,每個記憶體單元8位):段位址(16位) * 16 + 偏移位址(16位)

定址方式:

[bx] / [si] / [di] / [bp]:暫存器間接定址,注意:[bp] 預設下段位址由ss提供,而 [bx]、[si]、[di] 預設下段位址由ds提供

[bx + idata] / [si + idata] / [di + idata] / [bp + idata]:暫存器相對定址,還可以寫成 idata[bx] 或 [bx].idata

[bx + si] / [bx + di] / [bp + si] / [bp + di]:基址變址定址,注意基址只能是bx或bp,變址只能是si或di,還可以寫成 [bx][si]

[bx + si + idata] / [bx + di + idata] / [bp + si + idata] / [bp + di + idata]:還可以寫成 idata[bx][si] 或 [bx][si].idata

當然任何一種定址方式都可以顯式地由段暫存器(cs、ds、ss、es)給出段位址

4、記憶體讀寫

**(也可以理解為指令),資料,棧(棧內的資料)其實沒有具體分別,都是記憶體單元上的資料

cpu根據 cs 和 ip 兩個暫存器的值組合成記憶體位址,讀取指定記憶體單元上的資料,執行**(指令)

cpu根據 ds 的值和給出的偏移位址(16位)組合成記憶體位址,在指定記憶體單元讀取或寫入資料

cpu根據 ss 和 sp 兩個暫存器的值組合成記憶體位址,在指定記憶體單元讀取或寫入資料

因為讀寫方式的不同,也可以說使用不同的暫存器操作記憶體上的資料,記憶體上的資料值才有了不同的稱呼。

5、轉移指令

轉移指令按跳轉的範圍分短轉移(跳轉範圍為段內-128 ~ 127位元組),近轉移**移範圍為整個段),遠轉移**移範圍為整個記憶體空間)

jmp short 標號 :無條件轉移

jcxz 標號  :有條件轉移,在cx為零時轉移

loop 標號 :

有條件轉移,在cs不為零時轉移

。。。近轉移:(注意:指令中包含的是目的位址的絕對偏移位址,但call 標號和jmp near ptr 標號中包含的是與目的位址的相對偏移位移)

jmp near ptr 標號 :無條件轉移

jmp 暫存器(16位) :無條件轉移

call word ptr 記憶體位址(兩個記憶體單元) :將當前指令的偏移位址存入棧,在根據記憶體單元提供的偏移位址轉移

。。。

call far ptr 標號 :將當前指令的段位址及偏移位址存入棧,在根據標號提供的段位址和偏移位址轉移

call dword ptr 記憶體位址(四個記憶體單元) :將當前指令的段位址及偏移位址存入棧,再根據記憶體單元提供的段位址和偏移位址轉移

。。。

6、程式狀態字(psw)

zf(zero flag):零標誌位,結果為零時zf = 1,否則zf = 0;

pf(parity flag):奇偶標誌位,1的個數為偶數時pf = 1,否則pf = 0;

sf(sign flag):符號標誌位,結果為負時sf = 1,否則sf = 0;

cf(carry flag):進製標誌位,在無符號數運算的情況下,存在進製或借位時cf = 1,否則cf = 0;

of(overflow flag):溢位標誌位,在有符號數運算的情況下,溢位時of = 1,否則of = 0;

df(direction flag):方向標誌位,在串處理指令中,df = 0時每次操作後di、si遞增,否則遞減,可以通過cld指令對df置0,通過std指令對df置1;

if(interrupt flag):中斷標誌位,當檢測到可遮蔽中斷時,如if = 1,則響應中斷,否則不響應,可以通過sti指令對if置1,通過cli指令對if置0;

tf(trap flag):陷阱標誌位,檢測到tf = 1時產生單步中斷,否則繼續執行;

通過pushf、popf指令可以直接對標誌暫存器讀寫。

7、中斷

中斷可分為內中斷和外中斷,內中斷**於cpu內部,外中斷**於cpu外部。

cpu內部產生中斷的情況有:1、除法錯誤,2、單步執行,3、into指令,4、int指令。

cpu外部中斷由外部裝置如鍵盤,滑鼠等發出,可分為可遮蔽中斷和不可遮蔽中斷。

中斷型別碼:用於識別各類中斷,乙個位元組資料,可以表示256種不同中斷型別。

中斷向量表:在記憶體位址0000:0000~0000:03ff的1024個單元上,可以儲存256個中斷型別資料,每個中斷型別資料報含此中斷型別的中斷處理程式的段位址和偏移位址。

中斷處理程式:用來響應某個中斷的**。

8、中斷處理

⑴中斷觸發:向cpu傳送中斷請求及中斷型別碼(如int n)

⑵中斷預處理:由cpu硬體自動完成,順序依次為標誌暫存器(psw)入棧,tf置0,if置0,cs入棧,ip入棧,根據得到的中斷型別碼設定ip,cs(ip = n * 4、cs = n * 4 + 2)

⑶呼叫中斷處理程式:可以由程式設計師自己編寫自定義中斷處理程式,當然也可以呼叫dos或bios預置的中斷處理程式

⑷中斷後處理:通過呼叫iret指令cpu硬體自動處理,順序依次為ip出棧,cs出棧,標誌暫存器(psw)出棧

9、自定義中斷處理

⑴編寫中斷處理程式

⑵安裝(就是將中斷處理程式**複製到記憶體中)

⑶設定中斷向量表

10、dos和bios中斷處理

⑴開機後,cpu上電,初始化cs = 0ffffh,ip = 0,ffff:0處有一條轉移指令,cpu執行該指令後轉去執行bios中的硬體系統檢測和初始化程式(bios上的程式已固化在rom中)。

⑵初始化程式將建立bios所支援的中斷向量(將相關裝置如主機板,網絡卡,顯示卡等中的中斷處理程式入口位址複製到中斷向量表中),當然,這些裝置的中斷處理程式已固化在相應裝置的rom中。

⑶硬體系統檢測和初始化完成後,呼叫int 19h進行作業系統的引導。

⑷dos啟動後,除完成其他工作外,還將它所提供的中斷處理程式載入記憶體,建立相應的中斷向量。

[email protected]

希望不斷交流,共同進步!

組合語言學習

參考書籍 組合語言 王爽 著 清華大學出版社 選單導航 一 彙編基礎知識 二 暫存器和常見彙編指令演示 一 基礎知識 1 彙編指令是機器指令的助記符,同機器指令一一對應 2 每一種cpu都有自己的彙編指令集 3 cpu可以直接使用的資訊在儲存器中存放 4 在儲存器中指令和資料沒有任何區別,都是二進位...

組合語言學習

持續更新 彙編指令 1.mov指令 mov是乙個傳送指令,可以實現以下操作 有一點需要注意,資料不能直接傳給段暫存器,比如mov ds,100h就是錯誤的。但是可以將其他暫存器中的值賦給段暫存器。段暫存器有cs,ds,ss,es等。如果你想知道為什麼,那就可以去了解一下關於每條指令的硬體實現。後面還...

組合語言學習筆記

學習參考資料 大灰狼 講彙編 資料匯流排,位址匯流排,控制匯流排。位址匯流排有多少條就決定了cpu最大的記憶體使用量。80386有32位位址匯流排,所以它的定址能力就是4g.暫存器 通用暫存器,段暫存器,ax暫存器 通用暫存器,存放資料。高位位元組ah,低位位元組al。實體地址表示方法 位址加法器,...