上回我們學會了怎麼對暫存器進行賦值,而在匯程式設計序中,對暫存器的訪問,對記憶體單元的訪問必不可少。在開始之前,不妨想乙個問題:
乙個程式,涉及到的資料數量可能不在少數,那我們怎麼儲存它們?全存進那十幾個暫存器中?如果是幾十個資料,暫存器夠存麼?那我們該把這些資料存到**去?
本文是第三章的第一部分
首先,我們得明白對於記憶體儲存,每個記憶體單元是乙個位元組(乙個單元儲存乙個位元組)
如下圖(左邊代表第幾個記憶體單元,右邊代表記憶體單元儲存的值;記憶體中只有右邊的**,左邊的**是方便理解的):
例如第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暫存器,...