天天看點

彙編語言--寄存器(記憶體通路)

在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指令可以是如下的形式:

比如下面的代碼: