1. 程式人生 > >匯編語言第三章知識梳理及思考

匯編語言第三章知識梳理及思考

分享圖片 多少 實驗 ESS 處的 span 匯編 代碼 初始

第三章

內存訪問的角度學習寄存器

3.1內存中字的存儲

0號單元是低地址單元,1號單元是高地址單元。

問題:

技術分享圖片

(1)0地址單元(字節單元)中存放的字節型數據是多少?20H

(2)0地址字單元中存放的字型數據是多少?4E20

(3)2地址字單元中存放的字節型數據是多少?12H

(4)2地址單元中存放的字型數據是多少?0012H

(5)1地址字單元中存放的字型數據是多少?124EH

結論:任何兩個連續的內存單元,N號單元和N+1號單元,可以將它們看成一個地址為N的字單元中的高位字節單元N+1和低位字節單元N。

3.2DS和[address]

CPU要讀取一個內存單元的時候,必須先給出這個內存單元的地址;在8086CPU中有一個DS寄存器,通常用來存放要訪問的數據的段地址。執行指令時,8086CPU自動從DS中的數據為內存單元的段地址。

MOV指令的格式:

MOV 寄存器名,內存單元地址

“[……]”表示一個內存單元,“[……]”中的0表示內竄單元的偏移地址。

問題:能不能mov ds,1000

8086CPU不支持將數據直接送入段寄存器的操作,ds是一個段寄存器。數據>>通用寄存器>>段寄存器

將數據從寄存器送入內存單元:

MOV BX,1000H

MOV DS,BX

MOV [0],AL

3.3字的傳送

3.4mov、add、sub指令

以學的mov指令的幾種形式:

MOV 寄存器,數據

MOV AX,1234

MOV 寄存器,寄存器

MOV AX,BX

MOV 寄存器,內存單元

MOV AX,[0]

MOV 內存單元,寄存器

MOV [0],AX

MOV 段寄存器,寄存器

MOV DX,AX

根據已知的指令進行推測:

MOV 段寄存器,寄存器

技術分享圖片

驗證有效

MOV 內存單元,段寄存器

MOV 段寄存器,內存單元

對add、sub的總結:

技術分享圖片

問題:它們可以對段寄存器進行操作嗎?

驗證結果:不能。

3.5數據段

DS—>數據段 CS—>代碼段

小結:

1. 字在內存中存儲時,要用兩個地址連續的內存單元來存放,字的低位字節存放在地地址單元中高位字節存放在高地址單元中。

2. 用mov指令訪問內存單元,可以在mov指令中只給出內存單元的偏移地址,此時,段地址默認在DS寄存器中。

3. [address]表示一個偏移地址為address的內存單元。

4. 在內存和及竄起之間傳遞字型數據時,高地址單元和高8位寄存器、低地址單元和低8位寄存器相對應。

5. MOV、ADD、SUB是具有兩個操作對象的指令。JMP是具有一個操作對象的指令。

6. 可以根據自己的推測,在Debug中實驗指令的新格式。

3.6棧

8086CPU提供入棧和出棧指令(最基本的):

PISH(入棧)

POP(出棧)

PUSH AX :將寄存器ax中的數據送入棧中;

POP AX :從棧頂取出數據送入ax;

8086CPU的入棧和出棧操作都是以字位單位進行的。

兩個疑惑:

1. CPU如何知道一段內存空間被當作棧使用?

寄存器cs和ip中存放著當前指令的段地址和偏移地址。

8086CPU中有兩個寄存器:

段寄存器ss 存放棧頂的段地址

寄存器sp 存放棧頂的偏移地址

任意時刻,ss:sp指向棧頂元素

2. 執行push和pop的時候,如何知道哪個單元是棧頂單元?

任意時刻,ss:sp指向棧頂元素

PUSH指令的執行過程:

(1) sp=sp-2;

(2) 將ax中的內容送入ss:sp指向的內存單元處,ss:sp此時指向新棧頂;

POP指令執行過程:

(1) 將ss:sp指向的內存單元處的數據送入ax中;

(2) sp=sp+2,ss:sp指向當前棧頂下面的單元,以當前棧頂下面的單元為新棧頂。

問題:如果我們將10000H~1000FH這段空間當作棧,初始狀態棧是空的,此時,ss=1000H,sp=?

棧空,ss:sp指向占空間最高地址單元的下一個單元。

任何時刻,ss:sp指向棧頂元素,當棧為空的時候,棧中沒有元素,也就不存在棧頂元素。所以ss:sp只能指向棧的最底部單元下面的單元,該單元的偏移地址為棧最底部的字單元的偏移地址+2。

3.8棧頂超界的問題

在編程的時候要自己小心棧頂超界的問題,要根據可能用到的最大棧空間來安排棧的大小,防止入棧的數據與太多而導致的超界;執行出棧的時候繼續出棧二導致的超界。

3.9push、pop指令

push和pop指令的格式(1)

push 寄存器 將一個寄存器中的數據入棧

pop寄存器 用一個寄存器接收出棧的數據

push和pop指令的格式(2)

push 段寄存器 將一個段寄存器中的數據入棧

pop 段寄存器 用一個段寄存器接收出棧的數據

push和pop指令的格式(3)

push 內存單元 將一個內存單元處的字入棧(棧操作都是以字為單位)

pop內存單元 用一個內存字單元接收出棧的數據

push、pop實質上就是一種內存傳送指令,可以在寄存器和內存之間傳送數據,與mov指令不同的是,push和pop指令訪問的內存單元的地址不是在指令中給出的,而是由ss:sp指出的。

執行push時:先改變sp,後向ss:sp處傳送。

執行pop時:先讀取ss:sp處的數據,後改變sp。

棧頂的最大變化範圍為0~FFFFH。

3.10棧段

我們可以將一段內存定義為一個段,用一個段地址指示段,用偏移地址訪問內存單元。數據段放在DS中,代碼段放在CS中,棧段放在SS中。一段內存可以是代碼的存儲空間,又可以是數據的存儲空間,還可以是棧空間,也可以什麽都不是。關鍵在於CPU中寄存器的設置,即CS、IP、SS、SP、DS的指向。

匯編語言第三章知識梳理及思考