在cpu中,用16位來存儲一個字,高8位存放高位元組,低8位存放低位位元組。在記憶體中時,由于記憶體單元是位元組單元,剛一個字要用2個位址連續的記憶體單元來存放,字的低位位元組存在低位址單元.
字單元--存放一個字型資料(16位)的記憶體單元,由兩個位址連續的記憶體單元組成,高位址記憶體單元中存放字型資料的高位元組,低位址記憶體單元存放單元中存放字型資料的低位位元組
0位址單元中存放的位元組型資料為20h,0位址單元中存放的字型資料為4e20h,2位址單元中存放的位元組型資料為12h,2位址單元中存放的字型資料為0012h,
8086cpu中有一個ds寄存器,通常用來存放要通路資料的段位址。比如我們要讀取10000h單元的内容,可以用如下的程式段進行:
[……]表示一個記憶體單元,0表示記憶體單元的偏移位址
8086cpu是16位結構,可以一次性的傳送16位的資料,即一次性傳送一個字。例如:
問題1
記憶體中的情況如下圖,
寫出下面指令執行後寄存器ax,bx,cx中的值
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
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指令有以下幾種形式:
mov 寄存器,資料
mov 寄存器,寄存器
mov 寄存器,記憶體單元
mov 記憶體單元,寄存器
mov 記憶體單元,段寄存器
mov 段寄存器,寄存器
mov 寄存器,段寄存器
下面通過debug來驗證一下"mov 寄存器,段寄存器"指令:
驗證"mov 記憶體單元,段寄存器"指令:
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是具有一個操作對象的指令
在8086cpu程式設計的時候,可以将一段記憶體當做棧來使用,8086cpu提供2種棧的操作:push和pop,都是以字為機關進行操作
在8086cpu中,提供2中寄存器分别棧頂位址:段寄存器ss和寄存器sp,任意時刻,ss:sp指向棧頂元素。入棧時,棧頂從高位址向低位址方向增長
首先看一段代碼:
執行過程如下圖:
注意:字型資料用兩個單元存放,高位址單元存放高8位,低位址單元存放低8位
8086cpu中,有2個寄存器,段寄存器ss和寄存器sp,棧頂的段位址存放在ss中,偏移位址存放在sp中。任意時刻,ss:sp指向棧頂元素
8086cpu不保證我們對棧的操作不會超界,我們在程式設計的時候要自己操心棧頂超界的問題
push和pop指令是可以在寄存器和記憶體之間傳送資料的,push和pop指令可以是如下的形式:
比如下面的代碼: