本文主要從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處
參考資料
《匯編語言》--王爽