8086匯編 段寄存器
段寄存器存放內存中不同地址段的存儲,專門的寄存器存放段地址來提供使用。
8086CPU中主要使用4個段寄存器下面會有說明。
三種段
數據段
將段地址放在 DS中用mov、add、sub等訪問內存單元的指令時,CPU將我們定義的數據段中的內容當作數據段來訪問;
代碼段
將段地址放在 CS中,將段中第一條指令的偏移地址放在IP中CPU將執行我們定義的代碼段中的指令;
棧段
將段地址放在SS中,將棧頂單元的偏移地置放在 SP 中CPU在需要進行棧操作(push、pop)時,就將我們定義的棧段當作棧空間來用。
CS - 代碼段寄存器
一、說明
1、寄存器說明
CS 代碼段寄存器、專門存儲代碼指令地址的寄存器、它與指針寄存器IP配合使用。
- 功能:CS:代碼段地址存儲
- 功能:IP:代碼段偏移地址存儲
2、操作符start
start:定義指令開頭
功能:程序加載后,CS:IP指向要執行的第一條指令在start處!
; 定義程序第一行代碼指令 start: mov bx,0 ... mov ax,0 ; 程序結束 end staret
2、操作符offset
格式:offset 標號
功能:取得標號的偏移地址
assume cs:codeseg codeseg segment ; start與s都為標號 ; 相當於 mov ax,0 start: mov ax,offset start ; 相當於mov ax,3 s: mov ax,offset s codeseg ends end start
3、nop指令
使用:nop
功能: nop的機器碼占一個字節,起“占位”作用
assume cs:codeseg codeseg segment .. ; 占位一個字節 nop codeseg ends end
二、解析
1、案例
CS與IP根據地址計算得出內存地址,通過地址總線傳輸查找到內存地址中對應的3字節大小的指令,在通過數據總線取出發送給控制器執行,結果修改AX寄存器值。當任務執行完成后由於這條指令為3字節,IP的寄存器會加3、再次合成內存地址后會依次執行剩下指令。
2、案例
(1)從CS:IP指向內存單元讀取指令,讀取的指令進入指令緩沖器;(2)IP = IP + 所讀取指令的長度,從而指向下一條指令;(3)執行指令。 轉到步驟 (1),重復這個過程。
DS - 數據段寄存器
一、說明
1、寄存器說明
DS 數據段寄存器、專門存儲數據內存地址的寄存器、它與DI變指寄存器配合使用。
- 功能:DS:數據段地址存儲
- 功能:DI:數據段偏移地址存儲
- 功能:BX:可用於數據段偏移地址存儲、默認指向DS的通用寄存器。
2、定義數據大小
dw:定義字型數據
使用:dw 字單元數據1,字單元數據2
db:定義字節型數據
使用:db 字節型數據1,字節型數據2
dd:定義雙字型數據
使用:dd 雙字型數據1,雙字型數據2
3、dup 定義數據大小
功能:dup和db、dw、dd 等數據定義偽指令配合使用,用來進行數據的重復
dup的使用格式:
- db 重復的次數 dup (重復的字節型數據)
- dw 重復的次數 dup (重復的字型數據)
- dd 重復的次數 dup (重復的雙字數據)
二、使用
1、賦值使用
; ax 存放數據內存地址 mov ax, 123BH ; 將 ax 內存地址 存入ds數據段 mov ds, ax ; di 存入偏移地址0 mov di, 0
SS - 棧段寄存器
一、說明
1、寄存器說明
SS 段段寄存器、專門存儲棧數據的寄存器、它與BP變指寄存器配合使用。
- 功能:SS:數據段地址存儲
- 功能:BP:數據段偏移地址存儲
二、使用
https://www.cnblogs.com/xiangsikai/p/12467831.html
ES - 附加段寄存器
一、說明
ES 附加段寄存器、專門配合數據內存地址的寄存器、它與DI變指寄存器配合使用。
通常DS與SI取得數據的源地址、ES與DI取得數據的目標地址
- 功能:ES:數據段地址存儲
- 功能:DI:數據段偏移地址存儲
二、使用
說明:由於出現了兩個段寄存器,如果想確認是哪個就需要加入段前綴 mov es:[bx],dl
; 使用附加段寄存器 assume cs: code code segment moy ax 0ffffh moy ds, ax moy ax. 0020h mov es, ax mov bx, 0 mov Cx. 12 s: mov dl, [bx] mov es: [bx, d inc bx loop s moy ax, 4c00h int 21h code ends end