1:數據寄存器,一般稱之為通用寄存器組
8086 有8個8位數據寄存器,
這些8位寄存器可分別組成16位寄存器:
AH&AL=AX:累加寄存器,常用於運算;
BH&BL=BX:基址寄存器,常用於地址索引;
CH&CL=CX:計數寄存器,常用於計數;
DH&DL=DX:數據寄存器,常用於數據傳遞。
2:地址寄存器/段地址寄存器
為了運用所有的內存空間,8086設定了四個段寄存器,專門用來保存段地址:
CS(Code Segment):代碼段寄存器;
DS(Data Segment):數據段寄存器;
SS(Stack Segment):堆棧段寄存器;
ES(Extra Segment):附加段寄存器。
3:特殊功能的寄存器
IP(Instruction Pointer):指令指針寄存器,與CS配合使用,可跟蹤程序的執行過程;
SP(Stack Pointer):堆棧指針,與SS配合使用,可指向目前的堆棧位置。
BP(Base Pointer):基址指針寄存器,可用作SS的一個相對基址位置;
SI(Source Index):源變址寄存器可用來存放相對於DS段之源變址指針;
DI(Destination Index):目的變址寄存器,可用來存放相對於 ES 段之目的變址指針。
二、si,di使用的例子
SIDI是8086CPU中和bx功能相近的寄存器,SIDI不能夠分成兩個8位寄存器來使用.
下面三組指令實現了相同的功能:
(1) mov bx,0
mov ax,[bx]
(2) mov si,0
mov ax,[si]
(3) mov di,0
mov ax,[di]
下面的三組指令也實現了相同的功能:
(1) mov bx,0
mov ax,[bx+123]
(2) mov si,0
mov ax,[si+123]
(3) mov di,0
mov ax,[di+123]
用寄存器SI和DI實現將字符串 'welcome to masm!' 復制到它后面的數據區中.
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '............................'
datasg ends
分析:
我們編寫的程序大都是進行數據的處理,而數據在內存中存放,所以我們在處理數據之前首先要搞清楚數據存儲在什么地方,也就是說數據的內存地址.現在我們要對datasg段中的數據進行復制,我們先來看以下要復制的數據在什么地方,
datasg:0,這是要進行復制的數據的地址.那么復制到那里去呢?它后面的數據區.'welcome to masm!'從偏移地址0開始存放,長度為16個字節,所以,他們后面的數據區的偏移地址為16,就是字符串所要存放的空間,清楚了地址之后,我們就可以進行處理了.我們的ds:si指向要復制的原始字符串,用ds:di指向復制的目的空間,然后一個循環來完成復制,
代碼如下:
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov di,16
mov cx,8
s:mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start
注意在程序中, 我們用的16位寄存器進行內存單元之間的數據傳送,一次復制2個字節,一共循環8次(si和di每次加2)
用更少的代碼,實現:
分析:
我們可以利用[bx(si或di)+idata]的方式,來使程序變得簡潔.如下:
codesg segment
start:mov ax,datasg
mov ds,ax
mov si,0
mov cx,8
s:mov ax,0[si]
mov 16[ax],ax
add si,2
loop s
mov ax,4c00H
int 21H
codesg ends
end start