一、組合語言中,為什麼si和di不能同時使用彙編
其實你可以想一下,這兩個暫存器的意思,si源變址暫存器,di目地變址暫存器,既然是變址暫存器,那麼他們肯定是在某個位址的基礎上進行偏移變化,由此我們就得出了需要基址暫存器。
你要是把這兩個暫存器同時使用,那你位址變化的基址都沒有,你該怎麼變化呢?你在誰的基礎上變化(也就是位址偏移)?
對於這些彙編中的規定,其實有時並不需要書上詳細的介紹,我們都應該可以從中推導出這些規則,書上的那些介紹個人認為只是用來驗證我們的推測的。或是對我們所掌握的知識的進行檢測,用來說明我們所掌握的是對的!
1:資料暫存器,一般稱之為通用暫存器組
8086 有8個8位資料暫存器,
這些8位暫存器可分別組成16位暫存器:
ah&al=ax:累加暫存器,常用於運算;
ch&cl=cx:計數暫存器,常用於計數;
dh&dl=dx:資料暫存器,常用於資料傳遞。
2:位址暫存器/段位址暫存器
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
@
8086彙編暫存器
一 組合語言中,為什麼si和di不能同時使用彙編 其實你可以想一下,這兩個暫存器的意思,si源變址暫存器,di目地變址暫存器,既然是變址暫存器,那麼他們肯定是在某個位址的基礎上進行偏移變化,由此我們就得出了需要基址暫存器。你要是把這兩個暫存器同時使用,那你位址變化的基址都沒有,你該怎麼變化呢?你在誰...
8086彙編 段暫存器
段暫存器存放記憶體中不同位址段的儲存,專門的暫存器存放段位址來提供使用。8086cpu中主要使用4個段暫存器下面會有說明。將段位址放在 ds中用mov add sub等訪問記憶體單元的指令時,cpu將我們定義的資料段中的內容當作資料段來訪問 將段位址放在 cs中,將段中第一條指令的偏移位址放在ip中...
8086暫存器介紹
8086 有14個16位暫存器,這14個暫存器按其用途可分為 1 通用暫存器 2 指令指標 3 標誌暫存器和 4 段暫存器等4類。1 通用暫存器有8個,又可以分成2組,一組是資料暫存器 4個 另一組是指標暫存器及變址暫存器 4個 資料暫存器分為 ah al ax accumulator 累加暫存器,...