1. 程式人生 > >8086彙編暫存器及指令彙總

8086彙編暫存器及指令彙總


1   暫存器的分類

通用暫存器:

ax,bx,cx,dx,(ah,al,bh,bl,ch,cl,dh,dl);

sp,bp,si,di

指令暫存器:

ip

標誌暫存器:

FR

段暫存器:

cs,ds,ss,es

2   ax,bx,cx,dx

這四個暫存器存放一般資料,你可以在裡面存放任何資料,但是其用途會有不同。

AX (Accumulator):累加暫存器,也稱之為累加器;

BX (Base):基地址暫存器,[bx]表示對bx中存放內容作為地址的記憶體單元進行訪問

CX (Count):計數器暫存器,例如jcxz,loop指令都是根據CX暫存器的值進行判斷然後決定是否進行跳轉

DX (Data):資料暫存器,在進行32位的乘除法操作時,用它存放被除數的高16位或餘數。它也用於存放I/O埠地址

3     ah,al,bh,bl,ch,cl,dh,dl

每個AX,BX,CX,DX都可以分為高8位,低8位,這兩個8位可以單獨的做位一個暫存器來使用。例如:

MOV AH,00h

MOV AL,FFh

4   sp,bp,di,si

SI (Source Index):源變址暫存器,在串處理指令中,SI作為隱含的源變址暫存器與DS聯用,以確定資料段中的儲存單元地址

DI (Destination Index):目的變址暫存器,在串處理指令中,DI和附加段暫存器ES聯用,以達到在附加段中定址的目的

SP (Stack Pointer):堆疊指標暫存器,它指定棧頂的段偏移地址,和SS決定的棧段地址,一起決定了棧頂元素的地址

BP (Base Pointer):基指標暫存器,主要用於給出堆疊中資料區基址的偏移

5 CS,DS,SS,ES

CS (Code Segment):程式碼段暫存器,存放當前執行的程式的段地址

DS (DataSegment):資料段暫存器,存放當前執行的程式所用運算元的段地址

SS (StackSegment):堆疊段暫存器,存放當前執行的程式所用堆疊的段地址

ES (ExtraSegment):附加段暫存器,存放當前執行程式中一個輔助資料段的段地址

         8086CPU的CPU內部匯流排是16根,但是地址匯流排是20根,為了達到20根線的定址能力,就用了兩個16位的地址去合成一個20位的匯流排。例如一個20位的地址ABCDE,可以表示為ABCD,000E,那麼ABCDE =ABCD*16 + E;

或者 ABC0 + 00DE,那麼ABCDE = ABC0* 16 + DE;

或者 AB00 + 0CDE,那麼ABCDE = AB00*16 + CDE;

或者A000 + BCDE,那麼ABCDE = A000*16 + BCDE;

從上面可以看出對於8086CPU的一個段的最大長度就是64kb了。那麼所謂的段暫存器的作用就可想而知,他們就是為了提供20位地址中的段地址。

6   IP,FLAG

IP (Instruction Pointer):指令指標暫存器,和CS一起決定了指定的地址CS:IP

FLAG:標誌暫存器;


<1>進位標誌 CF,記錄運算時最高有效位產生的進位值。 
<2>符號標誌 SF,記錄運算結果的符號。結果為負時置1,否則置0。 
<3>零標誌  ZF,運算結果為0時ZF位置1,否則置0。 
<4> 溢位標誌 OF,在運算過程中,如運算元超出了機器可表示數的範圍稱為溢位。溢位時OF位置1,否則置0。 
<5>輔助進位標誌 AF,記錄運算時第3位(半個位元組)產生的進位值。 
<6>奇偶標誌 PF,用來為機器中傳送資訊時可能產生的程式碼出錯情況提供檢驗條件。當結果運算元中1的個數為偶數時置1,否則置0。

<7>方向標誌 DF,在串處理指令中控制處理資訊的方向。當DF=1時,串處理從高地址向低地址方向處理。當DF=0時,串處理就從低地址向高地址方向處理。 
<8>陷阱標誌 TF,用於除錯時的單步方式操作。當TF=1時,每條指令執行完後產生陷阱,由系統控制計算機;當TF=0時,CPU正常工作,不產生陷阱。 
<9>中斷標誌 IF,用於控制可遮蔽硬體中斷。當IF=1時,允許8086微處理器響應中斷請求,否則關閉中斷。 

//*****************************************

看《組合語言(第三版)》--王爽,暫時看到第11章,所以可能不太全面,接下來發現有缺漏、錯誤的,會繼續更新修正。

然後下面寫的是部分書上的內容加上我個人的理解,正因如此,由於我知識的侷限,可能會出現比較多的錯誤。

前提簡介:

>暫存器是CPU中程式設計師可以用指令讀寫的部件。程式設計師通過改變各種暫存器中的內容來實現對CPU的控制。------《組合語言(第三版)》第2章


簡單來說,我認為暫存器粗略看有點像控制檯,使用者輸入命令(修改暫存器中的資料),然後作業系統執行使用者的命令(CPU執行命令)。除此之外,我認為暫存器還有儲存功能,能有效提高CPU運算速度(不需要再從記憶體讀取資料)。


既然說到暫存器控制CPU,就說說是如何控制CPU的,在之前,先簡單說說一些和這個沒有多大關係,但作為前提的內容(當課外閱讀吧):

前提:首先所有的程式簡單點說都是由程式碼組成,而且不管最初是什麼語言的程式碼,到最後都轉化成二進位制數字,然後其中固定的二進位制數字串對應著該CPU中相應的動作(就是遇到這串二進位制數字,CPU就會執行相應的操作),我們就稱這樣一個固定的二進位制數字串為一條指令吧。然後這些指令都存儲在記憶體中(暫時當它都儲存在記憶體中,實際上是部分在記憶體,部分在磁碟),然後執行的時候,就是CPU一條一條地從記憶體提取指令、執行指令


小結:看完上面,我們再來整理一下上面內容,其實與CPU相關(換句話說CPU的動作)只有最後一句,從記憶體提取指令,然後執行指令,好啦,問題來啦,記憶體那麼大,CPU怎麼知道從哪裡提取指令?怎麼提取指令?然後怎麼執行指令?


然後後面兩個問題的答案和控制CPU已經沒什麼大關係了,因為這兩個我們都不能控制(推薦看《深入瞭解計算機系統》),所以說到最後,我們控制CPU實際上就是控制CPU從哪裡讀取指令(資料)


說到這裡又來說說前提(課外閱讀...),其實這個也是上面第二個問題(怎麼提取指令)的答案,讓我們先來看看圖片(所有圖片均來自《組合語言(第三版)-王爽》)


從記憶體讀取資料基礎版:

1.把需要讀寫的記憶體地址傳遞給記憶體(送上地址匯流排)

2.記憶體把相應地址的資料傳遞迴給記憶體


但由於當時條件限制,當時8086CPU是16位結構的CPU,就是說,在8086CPU內部,能夠一次性處理、傳輸、暫時儲存的資訊的最大長度是16位。然後記憶體單元的地址在送上地址匯流排之前,必須在CPU中處理、傳輸、暫時存放,而對於16位CPU能一次性處理、傳輸、暫時儲存16位的地址


而實際上8086CPU外的地址匯流排有20位,而從內部只能傳送出16位地址,這使20位地址匯流排不能得到充分利用因此採用由2個16位地址合成的方法形成一個20位的實體地址。至於如何合成,又來看看圖片:

實體地址=段地址x16+偏移地址

p.s.圖片中的數字是16進位制,4個二進位制數字等於一個16進位制數字


從記憶體讀取資料完整版:

1.CPU中的相關部件提供兩個16位的地址:段地址,偏移地址

2.段地址和偏移地址通過內部匯流排送入一個為地址加法器的部件

3.地址加法器將兩個16位地址合成一個20位的地址

4.地址加法器通過內部匯流排將20位實體地址送入輸入輸出控制電路

5.輸入輸出控制電路將20位實體地址送上地址匯流排

6.地址匯流排將20位實體地址送到儲存器

7.儲存器將相應的地址上的資料傳出


第三個前提

有一個硬體部分叫時鐘,然後在每一個時鐘週期,CPU都從記憶體讀取進一條指令


我們現在來總結一下前面的3個前提:在每一個時鐘週期,CPU根據當前的段地址和偏移地址讀取一條指令進來,然後執行。(前面一大段最後總結剩下一句。。。)


好啦,問題又來啦,CPU怎麼知道當前的段地址和偏移地址是什麼?說到現在,終於和我們的主題套上關係啦,對的,就是通過我們的主角---暫存器,來得知,段地址和偏移地址都有相應的暫存器進行儲存,特別是要執行的指令的段地址和偏移地址更是有固定的暫存器(cs,ip)進行儲存,然後CPU發出地址,就是直接把cs,ip中的資料發出去。

暫存器:

在8086CPU中一共有14個暫存器:

ax,bx,cx,dx,si,di,sp,bp,ip,cs,ss,ds,es,flag

每個暫存器都是16位,在下面對各個暫存器的逐一介紹中,根據功能或者其特點可能會將幾個暫存器劃分在一起介紹(所以一個暫存器可能會出現在多個地方,最後會給出總結表)

通用暫存器(ax,bx,cx,dx)

將它們4個劃分一起是由於它們的一個共同特性:

都可以分為獨立使用的2個8位暫存器來使用

ax:ah,al

bx:bh,bl

cx:ch,cl

dx,dh,dl


h結束的為高位,l的為低位,而且這兩個8位暫存器之間相互獨立,例如:ah本來為0000,0000,當你向al(其餘一樣)傳入一個數據,但這個資料已經超8位,就假設為1,0000,0000,最後結果為ah:0000,0000,al:0000,0000。傳進去的資料的最高位(超出的一位),將會被捨棄,而不是往ah進位。


好吧,實際上除了這個,它們也就沒什麼其它共同特點了(讀寫功能,那個所有暫存器都可以幹啦)。。。

地址相關暫存器:段地址+偏移地址(cs,ss,ds,es,ip,sp,bp,bx,si,di)

在上面的前提簡介的最後一部分中,提到過段地址和偏移地址儲存在暫存器中,在這部分中將會詳細介紹:

先來大體瞭解一下里面哪些用來儲存段地址,哪些儲存偏移地址:

段地址暫存器(段暫存器):cs,ss,ds,es

可用來儲存偏移地址的暫存器:ip,sp,bp,si,di

相關推薦

8086彙編指令彙總

1   暫存器的分類 通用暫存器: ax,bx,cx,dx,(ah,al,bh,bl,ch,cl,dh,dl); sp,bp,si,di 指令暫存器: ip 標誌暫存器: FR 段暫存器: cs,ds,ss,es

16位組合語言指令整理

第一次寫部落格,有點小緊張~ 暫存器 通用暫存器 8位暫存器 16位暫存器 32位暫存器 暫存器名稱 AH,AL AX EAX 累加暫存器

64位彙編

64位彙編中暫存器除了段暫存器外,其餘的都是64位,即8位元組,所以棧結構的入棧和出棧位元組數都要求模8。相比32位彙編,64位彙編的通用暫存器在數量上多了8個,共有16個通用暫存器,其中八個是相容32位彙編的,分別是將原來的名稱e**改成了r**,如eax改成rax,其餘8個分別命名為R8、R9、……R15

【arm】arm32位和arm64位架構、指令差異分析總結

Date: 2018.9.21 1、參考 2、前言   最近三個月的時間,都在進行解碼庫的arm架構彙編優化,包括arm32位彙編優化和arm64位彙編優化。在arm32位入門之後,只要掌握了兩種架構的暫存器和指令集差異之後,就可以很快上手編寫arm64

ARM的異常處理機制

arm的暫存器:     普通:r0-r15         r0-r12   //儲存任何資料         r13(sp)  

MIPS的指令和定址方式的分類

MIPS的32個暫存器 助記符 編號 作用 zero 0 恆為0 at 1 (assembly temporary)保留給彙編器使用 v0,v1 2-3

Nand flash(三)硬體初始化分析

關於NAND Flash S5PV210的NAND Flash控制器有如下特點: 1) 支援512byte,2k,4k,8k的頁大小 2) 通過各種軟體模式來進行NAND Flash的讀寫擦除等 3) 8bit的匯流排 4) 支援SLC和MCL的NAND Flash 5) 支

32位16位8位編號

編碼 32位                         16位                8位0      EAX      累加暫存器        AX                  AL1      ECX      計數暫存器        CX  

解釋執行和編譯執行的區別、基於棧和基於指令集區別

1. 解釋執行和編譯執行的區別 我們在學習java的時候,對class檔案都有個疑惑,虛擬機器是如何執行發方法中的位元組碼指令的呢?其實 虛擬機器的執行引擎在執行java程式碼的時候有解釋執行和編譯執行兩種選擇。通俗說來,解釋執行是通過直譯器執行,編譯執行即通

32位彙編

32位CPU所含有的暫存器有: 4個數據暫存器(EAX、EBX、ECX和EDX) 2個變址和指標暫存器(ESI和EDI) 2個指標暫存器(ESP和EBP) 6個段暫存器(ES、CS、SS、DS、FS和GS) 1個指令指標暫存器(EIP) 1個標誌暫存器(EFlags) 1、

x64彙編

1、暫存器 通用暫存器: 8位 al/ah cl/ch dl/dh bl/bh spl bpl sil dil r8b r9b r10b r11b r12b r

浮點數指令

暫存器 AVX浮點體系結構允許資料儲存在16個YMM暫存器中 255 127 0 %ymm0 %xmm0 1st FP arg.返回值 %ymm1 %xmm1 2nd FP引數 %ymm2 %x

基於棧與基於指令集架構

用C的語法來寫這麼一個語句: C程式碼   a = b + c;   如果把它變成這種形式: add a, b, c 那看起來就更像機器指令了,對吧?這種就是所謂“三地址指令”(3-address instruction),一般形式為: op dest, src1,

8086資料介紹

通用暫存器 在 8086 CPU 中,通用暫存器有 8 個,分別是 AX,BX,CX,DX,SP,BP,SI,DI  下面介紹這幾個通用暫存器: 資料暫存器(AX,BX,CX,DX): 資料暫存器有 AX,BX,CX,DX 四個組成, 由於在 8086 之前的

浮點浮點運算

原連結: 浮點執行環境的暫存器主要是8個通用資料暫存器和幾個專用暫存器,它們是狀態暫存器、控制暫存器、標記暫存器等 8個浮點資料暫存器(FPU Data Register),編號FPR0 ~ FPR7。每個浮點暫存器都是80位的,以擴充套件精度格式儲存資料。當其他型別資料

8086彙編學習之[BX],CX與loop指令,ES

一、彙編程式的基本格式: 1、基本格式與解析: assume cs:codeseg //assume假設CS暫存器與codeseg段有關聯,codeseg段本就是程式碼段 codeseg segment //段開始,codeseg為段名,可

彙編 第二章

在我看來,第二章中主要圍繞著6個暫存器展開闡述。它們分別是AX、BX、CX、DX、CS、IP。   在此之前,通過本章的學習,使我對CPU這一概念又有了更深一步的認識。 1.CPU中字長與位寬的區別 通常情況下,用字長來描述CPU。例如,字長16,則稱16位CPU。那麼16位CPU有什麼具體

組合語言——彙編的8種定址方式,以及2個預設段

1.立即定址方式 MOV AH, 80H(直接給暫存器賦值)2. 暫存器定址方式(源或者目的有一個是暫存器) 2.1) 源運算元是暫存器定址方式 如:ADD VARD, EAX  ADD VARW, AX   MOV VARB, BH等。 其中:VARD、VARW和VARB是雙字,字和位元組

x86彙編的幾種

菜鳥一枚,剛學彙編總結下 八個通用暫存器(沒有段暫存器) EAX,EBX,ECX,EDX,EBP,ESP,EDI,ESI ESP 指向棧頂 PUSH一個值進棧,是存放在ESP上面那個地方,push後ESP值減少,再次指向棧頂。POP是將ESP指向的值 POP出去,POP後ESP的值增

彙編函式 哪些在使用時需要保護和恢復現場

在寫彙編函式時,總感覺在哪些暫存器該保護哪些不需要保護的問題上比較模糊,要是保護所有使用到的暫存器感覺比較死板也不符合規則,所以就去網上搜了搜。找到了一些規則,我覺得這是一個規則問題,大家都遵守的話就可以相互複用函數了,當然這個規則也是有一定道理的。 1、你自己的函式在操作改變edi esi ebx ebp