CPU寄存器
8086 CPU 中寄存器總共為 14 個,且均為 16 位 。
即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 個。
而這 14 個寄存器按照一定方式又分為了通用寄存器,控制寄存器和段寄存器。
通用寄存器:
AX,BX,CX,DX 稱作為數據寄存器:
-
AX (Accumulator):累加寄存器,也稱之為累加器;
-
BX (Base):基地址寄存器;
-
CX (Count):計數器寄存器;
-
DX (Data):數據寄存器;
可以分為兩個獨立的 8 位的 AH(BH, CH, DH) 和 AL(BL, CL, DL) 寄存器
SP 和 BP 又稱作為指針寄存器:
-
SP (Stack Pointer):堆棧指針寄存器;
-
BP (Base Pointer):基指針寄存器;
SI 和 DI 又稱作為變址寄存器:
-
SI (Source Index):源變址寄存器;
-
DI (Destination Index):目的變址寄存器;
控制寄存器:
-
IP (Instruction Pointer):指令指針寄存器;
-
FLAG:標志寄存器;
段寄存器:
-
CS (Code Segment):代碼段寄存器;
-
DS (Data Segment):數據段寄存器;
-
SS (Stack Segment):堆棧段寄存器;
-
ES (Extra Segment):附加段寄存器;
操作數尋址
立即尋址
示例:
MOV AX, 1234H ; 給AX寄存器賦值為1234H
直接尋址
示例;
MOV BX, DS:[2000H]
操作數存放在存儲器中, 偏移量直接寫在操作數中,.
地址為數據段寄存器DS的值* 16 (<<4)然后加上直接給出的偏移量2000H.
寄存器尋址
示例:
MOV DX, AX ;將AX中的值賦給DX
直接使用寄存器中的值作為操作數, 速度較快.
寄存器間接尋址
操作數存放在存儲器中, 16位偏移地址存放在SI, DI, BP, BX四個寄存器之一中.
若使用BX, SI, DI之一作為寄存器, 操作數默認放在DS所決定的數據段中.
即地址為:DS *16 + BX
示例:
MOV AX, [SI] ; 將DS*16 + SI中的值放入AX中
若使用BP做間接尋址, 操作數默認放在SS決定的堆棧段中.
示例:
MOV AX, [BP] ;將SS*16 + BP中的值放入AX中
可以直接指定使用的段寄存器:
MOV AX, SS:[SI] ;將SS*16 + SI中的值放入AX中
寄存器相對尋址
操作數存放在存儲器中, 使用段寄存器內容* 16 加SI, DI, BP, BX四個寄存器之一的內容再加直接給出的位移量.
若使用BX, SI, DI之一作為寄存器, 操作數默認放在DS所決定的數據段中; 若使用BP做間接尋址, 操作數默認放在SS決定的堆棧段中.
與寄存器間接尋址相比只是增加了直接給出的偏移量:
示例:
MOV AX, [SI-2] ; 將 DS*16 + SI - 2中的值放入AX中
MOV AX, [BP+4] ;將 SS*16 + BP + 4中的值放入AX中
MOV AX, SS:[SI-8] ;將 SS*16 + SI - 8中的值放入AX中
基址變址尋址
將段地址寄存器的值*16加上基址寄存器(BX,BP)之一的地址加上變址寄存器(SI, DI)之一的值作為地址.
若使用BX作基址 操作數默認放在DS所決定的數據段中; 若使用BP做基址, 操作數默認放在SS決定的堆棧段中.
示例:
MOV AX, [BX][SI] ; 將 DS*16 +BX + SI中的值放入AX中
MOV AX, [BP][DI] ;將 SS*16 + BP + DI 中的值放入AX中
MOV AX SS:[Bx][SI] ;將 SS*16 + BX + SI 中的值放入AX中
基址變址相對尋址
在基址變址尋址基礎上再加一個直接給出的偏移量:
示例:
MOV AX, 1234H[BX][DI] ;將DS * 16 + BX + DI + 1234H中的值放入AX中.
還有幾種表示方法與上式等價:
MOV AX, [BX+DI+1234H]
MOV AX, 1234H[BX+DI]
MOV AX, 1234H[BX][DI]