彙編暫存器 8086

2021-06-09 19:31:18 字數 2441 閱讀 3398

一、組合語言中,為什麼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 累加暫存器,...