小白的彙編之路(三) 暫存器訪問

2021-10-02 02:25:20 字數 2512 閱讀 3751

上回我們學會了怎麼對暫存器進行賦值,而在匯程式設計序中,對暫存器的訪問,對記憶體單元的訪問必不可少。在開始之前,不妨想乙個問題:

乙個程式,涉及到的資料數量可能不在少數,那我們怎麼儲存它們?全存進那十幾個暫存器中?如果是幾十個資料,暫存器夠存麼?那我們該把這些資料存到**去?

本文是第三章的第一部分

首先,我們得明白對於記憶體儲存,每個記憶體單元是乙個位元組(乙個單元儲存乙個位元組)

如下圖(左邊代表第幾個記憶體單元,右邊代表記憶體單元儲存的值;記憶體中只有右邊的**,左邊的**是方便理解的):

例如第0個記憶體單元儲存的值為20h

020h

14eh

212h

334h

45fh

523h……

圖1在彙編中,1字=2位元組(1w=2b)

例如:第0個字單元就是由第0,1位元組單元組成

那第1個字單元呢?當然是由第1,2位元組單元組成

之後的以此類推。

那如果我們要儲存408eh到第0個字單元中。記憶體會怎麼變化呢?、

單元編號

儲存前儲存後

020h

8eh1

4eh40h

212h

12h3

34h34h

45fh

5fh5

23h23h……

…所以儲存後的記憶體示意圖才會那般變化。

我們在之前提及過cs暫存器,這回我們會涉及到ds與ss兩個暫存器,

我們在之前涉及過段的概念。

而在彙編中,有這樣的幾種段:資料段(ds),**段(cs),堆疊段(ss),附加段(es)

資料段(data segment):用來儲存資料的段

**段(code segment):用來存放**的段

堆疊段(stack segment):是乙個棧,使用時需要用到ss與sp兩個暫存器

附加段(extra segment)暫時不理會。

當我們需要對記憶體進行訪問時,需要通過段位址與偏移位址來進行定址;

對於**段,我們將段位址存入cs暫存器中,偏移位址借助ip暫存器;

對於資料段,我們將段位址存入ds暫存器中,偏移位址借助ip暫存器;

對於堆疊段(以下簡稱棧),我們將段位址存入ss暫存器,偏移位址存入sp暫存器中。

例如有這樣一段記憶體單元:

020h

14eh

212h

334h

45fh

523h……

圖3以下用ds代表ds暫存器,其他同理。

假設我們要編寫一段程式將408eh存入第1個字單元中,該怎麼編寫?

且第0個位元組單位的位址為 00000h

那麼我們怎麼將對應的值賦給ds?

我們已經學過:實體地址=段位址*16+偏移位址 所以有:ds存入0000h

mov ds,0000h

這樣就能將ds指向我們需要的段了,但程式這樣編寫對嗎?

8086cpu不支援直接將資料存入段暫存器中,所以我們要借助其他暫存器進行間接儲存。

正確的應該是:

mov ax,0000h

mov ds,ax

這樣我們就能獲取指定的段了

既然獲得指定的段了,那我們怎麼針對段內某乙個記憶體單元進行賦值?

我們可以借助[address]進行指定記憶體單元的賦值,但這一點的前提是建立在ds已指定好是哪個段了。

[address]表示乙個偏移位址為address的記憶體單元。 依舊是以此圖為例

020h

14eh

212h

334h

45fh

523h……

圖3借助[address]進行指定的話,假設有這樣的一段程式:

mov ax,0000h

mov ax,[0]

那麼就是說將第0個字單元存入ax暫存器中,此時ax暫存器的值為:4e20h

mov ax,0000h

mov al,[0]

將第0個位元組單元存入al暫存器中,此時ax暫存器的值為:0020h

那麼問題就來了,同樣是[0],為何兩次存值,第一次是字單元的賦值,而第二次是位元組單元的賦值? 答案就在於存值的暫存器:

第一次的ax是乙個16位暫存器,所以用[0]進行賦值的話,cpu是將第0個字單元的值存入ax暫存器中

第二次的al是乙個8位的暫存器,所以用[0]進行賦值的話,cpu是將第0個位元組單元的值存入al暫存器中

所以我們可以借助[address]將408eh存入第1個字單元中:

mov bx,408eh

mov [0],bx

mov:

mov 暫存器,資料

mov 暫存器,暫存器

mov 暫存器,記憶體單元

mov 記憶體單元,暫存器

mov 段暫存器,暫存器

subsub 暫存器,資料

sub 暫存器,暫存器

sub 暫存器,記憶體單元

sub 記憶體單元,暫存器

addadd 暫存器,資料

add 暫存器,暫存器

add 暫存器,記憶體單元

add 記憶體單元,暫存器

組合語言(三)暫存器(記憶體訪問)

在8086cpu中,乙個字由兩個位元組單元組成。位元組單元,即存放乙個字型資料 16位 的記憶體單元,由兩個連續的記憶體單元組成。在8086中,高位址記憶體單元存放字型資料的高位位元組,低位址存放字型資料的低位位元組。我們將起始位置位n的字單元簡稱位n位址字單元。同樣的cpu讀取乙個記憶體單元的時候...

mysql 訪問暫存器 暫存器 記憶體訪問

一 ds和 address cpu要讀寫乙個記憶體單元的時候,必須先給出這個記憶體單元的位址,在8086pc中記憶體位址有段位址和偏移位址組成。ds 資料暫存器 中通常存放要訪問資料的段位址。比如要讀取1000h單元的內容,可以用下面這段 mov bx,1000h mov ds,bx mov al,...

組合語言(三) 暫存器

任何兩個位址連續的記憶體單元,n號單元和 n 1號單元,可以將它們看成兩個記憶體單元 也可以看成乙個位址為n的字單元中的高位位元組單元和低位位元組單元。cpu要讀取乙個記憶體單元時,必須先給出這個記憶體單元的位址 在8086pc中,記憶體位址由段位址和偏移位址組成 8086cpu中有乙個ds暫存器,...