x86處理器架構(gòu)

寄存器
- AX:通用寄存器,低8位為AL寄存器,高8位為AH寄存器。一般是累加寄存器。
- BX:通用寄存器,低8位為BL寄存器,高8位為BH寄存器。一般還是基址寄存器。
- CX:通用寄存器,低8位為CL寄存器,高8位為CH寄存器。一般作循環(huán)計數(shù)器。
- DX:通用寄存器,低8位為DL寄存器,高8位為DH寄存器。一般還用于與外設(shè)進行數(shù)據(jù)交換。
- CS:代碼段寄存器。
- IP: 代碼段指針寄存器。只有處理器才能改變它的內(nèi)容。
- ES:附加段寄存器。
- DS:數(shù)據(jù)段寄存器。
- SS:棧段寄存器。
- SP:棧段指針寄存器。
- SI:源索引寄存器。
- DI:目標索引寄存器。
-
EFLAGS:存放CPU的2類標志的寄存器。
- 狀態(tài)標志:反映處理器當前的狀態(tài)。
- 控制標志:用來控制處理器的工作方式。
狀態(tài)標識每次運算后自動產(chǎn)生,控制標志的值則有指令設(shè)置。
| 標志 | 意義 |
|---|---|
| OF | 溢出標志;OF=1表示2個有符號數(shù)運算超出可表示范圍。 |
| DF | 方向標志(迭代方向,類比i++或者i--);執(zhí)行指令后,源或目的指 針加法還是減法。OF=1表示減法 |
| IF | 中斷允許標志;IF=1表示CPU響應(yīng)終端信號。 屬于控制標志 |
| SF | 符號標志;SF=1標識運算結(jié)果最高位為1。 |
| ZF | 零標志;ZF=1表示結(jié)果為0 |
| AF | 輔助進位標志 |
| PF | 奇偶標志;進行奇偶校驗。PF=1表示低8位中有偶數(shù)個1。 |
| CF | 進位/錯位標志; |
| TF | 單步狀態(tài)標識,用于程序調(diào)試,TF=1,每次執(zhí)行一條指令會暫停。 屬于控制標志 |
常用指令
-
mov 指令:
mov 目的, 源。
這里注意:- mov es,0xb800。這種寫法是錯誤的,intel不允許將一個立即數(shù)傳給* 段寄存器*。必須寫2條指令:mov ax ,0xb800。mov es,ax。
- mov [0x01], [0x02]。這種寫法也是錯誤的,處理器不允許在2個內(nèi)存單元之間直接進行數(shù)據(jù)傳輸?shù)牟僮鳌?/li>
movsb 指令
movsb和movsw用于把內(nèi)存中的一個地方數(shù)據(jù)批量地傳送到另一個地方。原始數(shù)據(jù)串地址由【DS】:【SI】指定,目標數(shù)據(jù)串地址由【ES】:【DI】指定,個數(shù)由CX指定。傳送方向EFLAGS寄存器中的DF標志指定。DF=0,表示正向傳送,SI和DI加1或加2(低地址到高地址)。DF=1表示反向傳送,類比。inc和dec 指令:
inc表示自增,dec表示自減。
inc al。
inc byte [ax]。AND 指令:
與運算,有0得0,全1為1。
AND指令會影響EFLAGS:OF和CF位被清零,SF ZF PF位狀態(tài)依計算結(jié)果而定,AF狀態(tài)未定義。
OR 指令:
或運算,有1得1,全0為0。
OR指令會影響EFLAGS寄存器:OF和CF位被清零,SF ZF PF位狀態(tài)依計算結(jié)果而定,AF狀態(tài)未定義。XOR 指令:
異或:相異為1,相同為0。
例如:xor dx, dx。 則將dx和dx異或結(jié)果存放在dx中。這條指令可以將dx清零。同樣效果的指令:mov dx,0。但是前者機器碼是31 D2,后者的機器碼是BA 00,00。xor指令不但更短,并且2個操作數(shù)都是通用寄存器,執(zhí)行速度更快。shr邏輯右移指令:
邏輯右移指令執(zhí)行時,會將操作數(shù)連續(xù)地向右移動指定位數(shù),每移動一次, “擠”出來的比特位被移到標志寄存器的CF位,左邊空出來的補0。shl邏輯左移指令:
和邏輯右移指令類似,會將操作數(shù)連續(xù)地向左移動指定位數(shù),每移動一次,“擠”出來的比特位被移到標志寄存器的CF位,右邊空出來的補0。rol 循環(huán)右移指令:
rol 循環(huán)左移指令:
-
DB 等指令:
- DB的意思是聲明字節(jié)(8)數(shù)據(jù),跟在它后面的操作數(shù)都占一個字節(jié)的長度。例如:DB 0
- DW指令:用于聲明字(16)數(shù)據(jù)。
- DD指令:用于聲明雙字(32)數(shù)據(jù)。
- DQ指令:用于聲明四字(64)數(shù)據(jù)。
這一系列的指令都屬于偽指令,偽指令沒有對應(yīng)的及其指令,僅僅在編譯階段由編譯器執(zhí)行。程序執(zhí)行時,偽指令已經(jīng)不存在。
-
DIV 指令:
8086處理器提供2種類型的除法:- 16位二進制除以8位二進制
- 被除數(shù):AX寄存器提供。
- 除數(shù):通用寄存器或者內(nèi)存單元提供。
- 商:存在AL寄存器中。
- 余數(shù):存在寄存器AH中。 - 32位的二進制數(shù)除以16位的二進制數(shù)
- 被除數(shù):高16位在DX中,低16位在AX中。
- 除數(shù):通用寄存器或者內(nèi)存單元提供。
- 商:存在AX寄存器中。
- 余數(shù):存在DX寄存器中。
- 16位二進制除以8位二進制
in 指令:
in指令是從端口讀,只有:
in al(端口號), dx;
in ax(端口號),dx;
in al(端口號),0xf0;
也就是說in指令的目的操作數(shù)必須是寄存器AL或者AX(8位的端口就是AL,16位的端口就是AX)。同時,in指令的源操作數(shù)應(yīng)該是寄存器DX或者立即數(shù)(端口號)。out 指令:
out指令向通過端口向外圍設(shè)備發(fā)送數(shù)據(jù)。和in指令相反源操作操作數(shù)是AL或AX,目的操作數(shù)是立即數(shù)(端口號)或者DX。
out 0x37(端口號),al
out dx(端口號), ax
尋址方式
- 寄存器尋址
- 立即數(shù)尋址
- 內(nèi)存尋址
其實就是指令中提供偏移地址,加上段寄存器最后形成地址。- 直接尋址(操作數(shù)是一個偏移地址)
- 基址尋址
用基址寄存器BX或者BP來提供偏移地址。采用BX基址寄存器時,默認 段寄存器是DS,采用BP基址寄存器時,默認的寄存器是SS。