1. 程式人生 > >第三章 寄存器(內存訪問)

第三章 寄存器(內存訪問)

push 來安 直接 分享圖片 info cpu 防止 修改 mov指令

一、一個字=兩個字節。地位字節存放在低地址單位中,高位字節存放在高地址單元中,取低地址內存單元作為字數據地址。(小端法

引入概念:字單元:存放一個字型數據的內存單元,由兩個地址連續的內存單元組成。

N地址字單元:將起始地址為N的字單元簡稱為N地址字單元。

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

二、8086CPU自動取DS中的數據為內存單元的段地址。

(eg:mov bx,1000H

mov ds,bx

mov al,[0]

[...]表示一個內存單元,[...]中的0表示偏移地址,ds值為段地址。由ds和偏移地址能得到物理地址。

操作數是內存單元時,指令中只給出「偏移地址」。 默認,「段地址」在ds中。

mov ds,1000H(錯誤)原因:8086CPU不支持將數據直接送入段寄存器的操作。

三、字的傳送:註意區分mov ax,[0]和mov al,[0]

mov ax,[0]:字型數據傳送

mov al,[0]:字節數據傳送

四、mov、add、sub指令

註意:1、常數不能作為目的操作數。

2、作為源操作數時,若最高位是16進制的A~F,前加0。

3、兩個操作數長度要一致。

4、兩個內存單元之間不能直接傳送數據。(eg:mov [1], [2] ×)

5、不能使用mov指令修改CS和IP的值。

6、兩個段寄存器之間不能直接傳送;不能把常數送到段寄存器。(eg:mov ds, cs × mov ds, 1000H ×

形式:mov 寄存器,數據 mov 內存單元,寄存器

mov 寄存器,寄存器 mov 段寄存器,寄存器

mov 內存單元,常數 mov 內存單元,段寄存器

mov 寄存器,段寄存器 mov 段寄存器,內存單元

mov 內存單元,數據

mov [1],byte ptr 3和mov byte ptr [1],3

因為數據3占用的字節數不確定,而計算機系統只執行確定的東西,用btye ptr 確定占用的字節數。

add與sub形式幾乎相同,以add為例:

add 寄存器,數據 add 寄存器,寄存器

add 寄存器,內存單元 add 內存單元,寄存器

段寄存器不可以用在算術指令中。

五、數據段

用ds存放數據段的段地址,再根據需要,用相關的指令訪問數據段的具體單元。

六、棧

特點:只能在一段進出。

後進先出。

七、CPU提供的棧機制

註:8086CPU中棧以字為單位。技術分享圖片

引入指令:PUSH(入棧:把數據存入棧)和POP(出棧:從棧取出數據)

棧頂:最後入棧的字數據所對應的地址單元。

棧底:固定的一端,棧區最高地址單元的前一個單元

棧為空時,棧頂指向棧底+2

寄存器:SSSP

SS:棧段段寄存器,用於存放棧段的「段地址」

SP:棧指針寄存器,用於存放棧頂的偏移地址。

(SS) × 16 + (SP) → 棧頂的物理地址

任意時刻,SS:SP都指向棧頂元素。

進棧: 棧頂上移兩個單元,即: 棧頂-2 → 棧頂 ,存入數據。

出棧: 棧頂下移兩個單元,即: 棧頂+2 → 棧頂 ,取出數據。

八、越界的問題

當棧滿的時候,再使用push指令入棧; 當棧空的時候,再使用pop指令出棧。

編程時要根據可能用到的最大棧空間,來安排棧的大小,防止入棧的數據太多而導致的超界;執行出棧操作也要註意,以防棧空的時候繼續出棧而導致的超界。

九、push、pop指令

形式:push 寄存器

push 段寄存器

push 內存單元

:1、棧的操作都是以為單位。

2、操作對象不能是常數。

3、pop 段寄存器中,段寄存器不能是CS和SS。

棧的初始化條件:eg:mov ax,1000H

mov ss,ax

mov sp,0010H

十、棧段

一個棧段的最大容量為64KB

「段」是一個邏輯上的概念。 編程時,可根據需要指定一段內存區用作數據段、代碼段或是棧段

用作數據段時,要把段地址→DS。

用作棧段時,要把段地址→SS,棧頂偏移地址 → SP。

用作代碼段時,段地址→CS,要取的指令偏移地址→IP。但CS和IP的值不能使用mov改變。

第三章 寄存器(內存訪問)