彙編03 暫存器

2022-08-19 15:21:09 字數 3165 閱讀 8231

乙個cpu由以下幾個部分組成:

1、運算器:負責資訊處理

2、暫存器:進行資訊儲存

3、控制器:控制各種器件進行工作

4、內部匯流排:連線各種器件(外部匯流排實現cpu和主機板其他部件的聯絡)

8086cpu的所有暫存器都是16位的,可以存放兩個位元組,ax、bx、cx、dx這4個暫存器通常用來存放一般性的資料,被稱為通用暫存器。它的上一代cpu中的暫存器都是8位的,為了保證相容,使原來基於上代cpu編寫的程式稍加修改就可以執行在8086之上,8086cpu的ax、bx、cx、dx這4個暫存器都可以分成2個可獨立使用的8位暫存器使用:如ax可以分為ah和al、bx可以分為bh和bl:

ax的低8位組成了al暫存器、高8位組成了ah暫存器,它們分別都可以獨立使用。當分別使用這兩個暫存器時,這兩種暫存器是獨立的,乙個暫存器的進製不會影響另乙個暫存器。在彙編指令中,不能讓操作物件的位數不一致,如果乙個是8位,乙個是16位(比如在16位暫存器和8位暫存器之間傳遞資料、將大於最大容量的資料直接存放在暫存器中等),就會出錯。

8086cpu可以一次性處理以下兩種尺寸的資料:位元組byte(8bit)、字word(2byte)

」2位址字單元「表示該字單元(2bytes即2個記憶體單元)的起始位址為2。在存入乙個字的時候,高位元組在高位址位,低位元組在低位址位。

8086cpu是16位cpu,16位cpu意味著:

1、運算器一次最多可以處理16位的資料

2、暫存器的最大寬度為16位

3、暫存器和運算器之間的通路為16位

cpu內部提供兩個16位的位址,乙個稱為段位址乙個稱為偏移位址,這兩個位址通過內部匯流排送入乙個稱為位址加法器的部件,合成為乙個20位的實體地址,然後通過輸入輸出電流將該實體地址送入位址匯流排,最後傳送到儲存器。

段並不是記憶體位址空間的基本劃分,而是抽象出來的乙個概念,在程式設計時根據具體情況,將若干位址連續的記憶體單元看成乙個段,這個段有起始位址(起始位址=段位址*16),有大小。同乙個記憶體位址空間,可以根據不同情況有多種劃分:

根據段位址和實體地址的轉換規則,段的起始位址一定是16的倍數,因為偏移位址最大為16位,有64kb的定址能力,所以乙個段的最大長度為64kb。

「資料在記憶體21f60h單元中」等價於「資料存在記憶體的2000h段中的1f60h單元中」

這兩個暫存器是8086cpu中最關鍵的兩個暫存器,它們指示了cpu當前要讀取指令的位址。cs為**段暫存器,ip為指令指標暫存器。設cs中的內容為m,ip中的內容為n,8086cpu將從記憶體m*16+n開始,讀取一條指令並執行。也可以表述為:cpu將cs:ip指向的內容當做指令執行。

當從對應實體地址取出一條指令執行時,ip中的值就要增加,如果指令長度為3位元組,對應ip的值就要加3個位元組的位址,然後繼續取指令執行。指令從記憶體中取出,傳送到cpu的指令緩衝器中,然後送到執行控制器中執行。一直重複這個過程。

在8086cpu加電啟動或者復位後,cs和ip分別被置為ffffh和0000h,然後開始執行上述過程,ffff0h單元中的指令是8086pc機開機後執行的第一條指令。

ds暫存器是段暫存器的一種,經常用來存放要訪問資料的段位址。

讀取10000h的內容:

mov bx,1000h			將1000h這個數放到暫存器bx中

mov ds,bx 將bx暫存器的值放入ds暫存器中

mov al,[0] 將段位址為1000h,偏移量為0的記憶體位址的值放入al暫存器中

注意僅知道偏移量是無法唯一確定位址的,還需要知道段位址,指令執行的時候會自動從ds暫存器中讀取段位址。而且不能直接將1000h資料放入ds暫存器中,8086cpu不支援這種操作,這與其硬體設計有關,所以只能先用乙個暫存器進行中轉了。

同理,將al暫存器中的資料放入記憶體單元中:

mov bx,1000h			

mov ds,bx

mov [0],al 將al暫存器中的值放入段位址為1000h,偏移量為0的記憶體位址

mov指令訪問記憶體單元的時候,方括號只是標出了偏移位址,段位址預設存在ds暫存器中。

mov可以用來在暫存器之間、暫存器和記憶體單元傳遞資料,還可以把資料直接賦值到暫存器中(注意在彙編源程式中,資料不能以字母開頭,如a000h,必須寫為0a000h):

mov ax, 8				將數字8賦值給ax暫存器

mov ax, bx 將bx暫存器的值賦值給ax暫存器

mov ax, [0] 將偏移量為0的記憶體單元的值賦值給ax暫存器

mov可以傳1個字,也可以傳遞1個位元組,這取決於目標暫存器的容量。

add和sub也有兩個操作物件,它們的用法和mov類似,也可以操作記憶體和暫存器:

add ax, 8				將暫存器ax中的值加8

sub ax, bx 將暫存器ax中的值減去bx暫存器中的值,然後存入ax中

入棧和出棧指令:(8086cpu的入棧和出棧操作都是以字為單位進行的)

push ax				將ax暫存器中的值送入棧中

pop ax 將棧頂資料取出送入ax暫存器中

當然這些指令也可以使用記憶體位址和段暫存器作為操作物件。

有兩個暫存器存放棧頂的位址,分別是段暫存器ss和暫存器sp,任意時刻下,ss:sp指向棧頂元素。

當執行push或pop指令的時候,都伴隨著暫存器sp中值的修改,其中的位址要偏移兩個位元組(push時指標向低位址移動,pop時向高位址移動)。

8086cpu不保證對棧的操作正確,當棧滿的時候push,或棧空的時候pop,都可能會影響棧以外的資料,引發一連串錯誤,所以在程式設計的時候要注意這個問題(或許我們可以設定兩個暫存器裝著棧空間的範圍,每次操作的時候檢查是否超出範圍,但是8086cpu中沒有這樣的設計)

push和pop本質上是記憶體傳送指令,只不過它要訪問的記憶體單元的位址不是在指令中給出的,而是由兩個暫存器給出的,而且這兩個指令在操作時還要改變sp暫存器中的值。

彙編暫存器知識

一 32位cpu所含有的暫存器有 1 資料暫存器。4個 eax ebx ecx edx。2 變址暫存器 index register 2個 esi edi。3 指標暫存器 pointer register 2個 esp extended stack pointer ebp extended base...

彙編暫存器 8086

一 組合語言中,為什麼si和di不能同時使用彙編 其實你可以想一下,這兩個暫存器的意思,si源變址暫存器,di目地變址暫存器,既然是變址暫存器,那麼他們肯定是在某個位址的基礎上進行偏移變化,由此我們就得出了需要基址暫存器。你要是把這兩個暫存器同時使用,那你位址變化的基址都沒有,你該怎麼變化呢?你在誰...

彙編3 暫存器

3.1記憶體中字的儲存 任何兩個位址連續的記憶體單元,n號和n 1號單元,可以將它們看成兩個記憶體單元,也可以看成乙個位址為n的字單元中的高位位元組單元和低位位元組單元。3.2段位址暫存器 ds是段位址暫存器,裡面儲存的是16位的資料,代表當前段位址。不能直接通過mov指令將資料存入ds中,mov ...