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
1 暫存器的分類
通用暫存器:
ax,bx,cx,dx,(ah,al,bh,bl,ch,cl,dh,dl);
sp,bp,si,di
指令暫存器:
ip
標誌暫存器:
FR
段暫存器:
cs,ds,ss,es
第一次寫部落格,有點小緊張~
暫存器
通用暫存器
8位暫存器
16位暫存器
32位暫存器
暫存器名稱
AH,AL
AX
EAX
累加暫存器
64位彙編中暫存器除了段暫存器外,其餘的都是64位,即8位元組,所以棧結構的入棧和出棧位元組數都要求模8。相比32位彙編,64位彙編的通用暫存器在數量上多了8個,共有16個通用暫存器,其中八個是相容32位彙編的,分別是將原來的名稱e**改成了r**,如eax改成rax,其餘8個分別命名為R8、R9、……R15
Date: 2018.9.21
1、參考
2、前言
最近三個月的時間,都在進行解碼庫的arm架構彙編優化,包括arm32位彙編優化和arm64位彙編優化。在arm32位入門之後,只要掌握了兩種架構的暫存器和指令集差異之後,就可以很快上手編寫arm64
arm的暫存器: 普通:r0-r15 r0-r12 //儲存任何資料 r13(sp)   MIPS的32個暫存器
助記符
編號
作用
zero
0
恆為0
at
1
(assembly temporary)保留給彙編器使用
v0,v1
2-3
關於NAND Flash
S5PV210的NAND Flash控制器有如下特點:
1) 支援512byte,2k,4k,8k的頁大小
2) 通過各種軟體模式來進行NAND Flash的讀寫擦除等
3) 8bit的匯流排
4) 支援SLC和MCL的NAND Flash
5) 支
編碼 32位 16位 8位0 EAX 累加暫存器 AX AL1 ECX 計數暫存器 CX
1. 解釋執行和編譯執行的區別
我們在學習java的時候,對class檔案都有個疑惑,虛擬機器是如何執行發方法中的位元組碼指令的呢?其實 虛擬機器的執行引擎在執行java程式碼的時候有解釋執行和編譯執行兩種選擇。通俗說來,解釋執行是通過直譯器執行,編譯執行即通
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、
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 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位的,以擴充套件精度格式儲存資料。當其他型別資料
一、彙編程式的基本格式:
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有什麼具體
1.立即定址方式 MOV AH, 80H(直接給暫存器賦值)2. 暫存器定址方式(源或者目的有一個是暫存器) 2.1) 源運算元是暫存器定址方式 如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。 其中:VARD、VARW和VARB是雙字,字和位元組
菜鳥一枚,剛學彙編總結下
八個通用暫存器(沒有段暫存器) EAX,EBX,ECX,EDX,EBP,ESP,EDI,ESI
ESP 指向棧頂 PUSH一個值進棧,是存放在ESP上面那個地方,push後ESP值減少,再次指向棧頂。POP是將ESP指向的值 POP出去,POP後ESP的值增 在寫彙編函式時,總感覺在哪些暫存器該保護哪些不需要保護的問題上比較模糊,要是保護所有使用到的暫存器感覺比較死板也不符合規則,所以就去網上搜了搜。找到了一些規則,我覺得這是一個規則問題,大家都遵守的話就可以相互複用函數了,當然這個規則也是有一定道理的。
1、你自己的函式在操作改變edi esi ebx ebp 相關推薦
8086彙編暫存器及指令彙總
16位組合語言暫存器及指令整理
64位彙編暫存器
【arm】arm32位和arm64位架構、暫存器和指令差異分析總結
ARM的暫存器及異常處理機制
MIPS的暫存器、指令和定址方式的分類
Nand flash(三)暫存器及硬體初始化分析
32位16位8位暫存器及編號
解釋執行和編譯執行的區別、基於棧和基於暫存器的指令集區別
32位彙編暫存器
x64彙編 暫存器
浮點數暫存器與指令
基於棧與基於暫存器的指令集架構
8086資料暫存器介紹
浮點暫存器及浮點運算
8086彙編學習之[BX],CX暫存器與loop指令,ES暫存器等
彙編 第二章 暫存器
組合語言——彙編的8種定址方式,以及2個預設段暫存器
x86彙編的幾種暫存器
彙編函式 哪些暫存器在使用時需要保護和恢復現場