匯編語言--寄存器(內存訪問)


本文主要從CPU如何執行指令的角度講解了8086CPU的邏輯結構、形成物理地址的方法、相關的寄存器以及一些指令

本文地址:http://www.cnblogs.com/archimedes/p/assembly-register-memory.html,轉載請注明源地址。

內存中字的存儲

在cpu中,用16位來存儲一個字,高8位存放高字節,低8位存放低位字節。在內存中時,由於內存單元是字節單元,剛一個字要用2個地址連續的內存單元來存放,字的低位字節存在低地址單元. 

字單元--存放一個字型數據(16位)的內存單元,由兩個地址連續的內存單元組成,高地址內存單元中存放字型數據的高字節,低地址內存單元存放單元中存放字型數據的低位字節

0地址單元中存放的字節型數據為20H,0地址單元中存放的字型數據為4E20H,2地址單元中存放的字節型數據為12H,2地址單元中存放的字型數據為0012H,

DS和[address]

8086CPU中有一個DS寄存器,通常用來存放要訪問數據的段地址。比如我們要讀取10000H單元的內容,可以用如下的程序段進行:

mov bx,1000H
mov ds,bx
mov al,[0]

[……]表示一個內存單元,0表示內存單元的偏移地址

字的傳送

8086CPU是16位結構,可以一次性的傳送16位的數據,即一次性傳送一個字。例如:

mov bx,1000H
mov ds,bx
mov ax,[0]  ;1000:0處的字型數據送入ax
mov [0],cx  ;cx中的16位數據送到1000:0

問題1

內存中的情況如下圖,

寫出下面指令執行后寄存器ax,bx,cx中的值

mov ax,1000H
mov ds,ax
mov ax,[0]
mov bx,[2]
mov cx,[1]
add bx,[1]
add cx,[2]

mov ax,1000H 執行后,ax=1000H

mov ds,ax 執行后,ds=1000H

mov ax,[0] 執行后,ax=1123H

mov bx,[2] 執行后,bx=6622H

mov cx,[1] 執行后,cx=2211H

add bx,[1] 執行后,bx=bx+[1]=6622H+2211H=8833H

add cx,[2] 執行后,cx=6622H+2211H=8833H

問題2

內存中的情況如下圖,

寫出下面指令執行后寄存器ax,bx,cx中的值

mov ax,1000H
mov ds,ax
mov ax,11316
mov [0],ax
mov bx,[0]
sub bx,[2]
mov [2],bx

mov ax,1000H 執行后,ax=1000H

mov ds,ax 執行后,ds=1000H

mov ax,11316 執行后,ax=2C34H

mov [0],ax 執行后,1000:1存儲2C,1000:0存儲34

mov bx,[0] 執行后,bx=2C34

sub bx,[2] 執行后,bx=2C34-1122=1B12

mov [2],bx 執行后,1000:2存儲1B12

指令執行結果如下:

mov、add、sub指令

mov指令有以下幾種形式:

mov 寄存器,數據

mov 寄存器,寄存器

mov 寄存器,內存單元

mov 內存單元,寄存器

mov 內存單元,段寄存器

mov 段寄存器,寄存器

mov 寄存器,段寄存器

下面通過debug來驗證一下"mov 寄存器,段寄存器"指令:

驗證"mov 內存單元,段寄存器"指令:

mov ax,1000H
mov ds,ax
mov [0],cs

add和sub指令同mov一樣,都有兩個操作對象,也可以有下面幾種形式:

add 寄存器,數據

add 寄存器,寄存器

add 寄存器,內存單元

add 內存單元,寄存器

sub 寄存器,數據

sub 寄存器,寄存器

sub 寄存器,內存單元

sub 內存單元,寄存器

數據段

相關結論:

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

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

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

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

5、mov、sub、add是具有兩個操作對象的指令,jmp是具有一個操作對象的指令

CPU提供的棧機制

在8086CPU編程的時候,可以將一段內存當做棧來使用,8086CPU提供2種棧的操作:push和pop,都是以字為單位進行操作

在8086CPU中,提供2中寄存器分別棧頂地址:段寄存器SS和寄存器SP,任意時刻,SS:SP指向棧頂元素。入棧時,棧頂從高地址向低地址方向增長

首先看一段代碼:

mov ax, 0123H
push ax
mov bx, 2266H
push bx
mov cx, 1122H
push cx
pop ax
pop bx
pop cx

執行過程如下圖:

注意:字型數據用兩個單元存放,高地址單元存放高8位,低地址單元存放低8位

8086CPU中,有2個寄存器,段寄存器SS和寄存器SP,棧頂的段地址存放在SS中,偏移地址存放在SP中。任意時刻,SS:SP指向棧頂元素

8086CPU不保證我們對棧的操作不會超界,我們在編程的時候要自己操心棧頂超界的問題

push、pop指令

push和pop指令是可以在寄存器和內存之間傳送數據的,push和pop指令可以是如下的形式:

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

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

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

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

;push和pop指令也可以在內存單元和內存單元之間傳送數據,還可以:

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

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

比如下面的代碼:

mov ax, 1000H
mov ds, ax ;內存單元的段地址要放在ds中
push [0] ;將1000:0處的字入棧中
pop [2]  ;出棧,出棧的數據送入1000:2處

參考資料

《匯編語言》--王爽


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM