zhouqijie

x86指令

x86是一种复杂指令集(CISC)。
x86使用变长度指令,即指令的长度不是固定的。



1、传送类指令

示例:MOV指令:

MOV AL, BL //BL寄存器的内存传送到AL寄存器中
//(给出存放操作数的寄存器名称)

MOV ECX, [1000H] //将1000H指向的存储器单元的内容取传送到ECX寄存器中
//(给出存放操作数的存储器地址)

MOV [DI], AX //将AX寄存器的内容传送到某个存储器单元(存储器单元的地址存储在DI寄存器中)
//(给出存放“存放操作数的存储器地址”的寄存器名称)

MOV WORD PTR[BX+SI*2+200H], 01H
//(给出“存放操作数的存储器地址”的计算方法)


- 编码:    

<img src="Images/x86_Instructions_cate1_mov_encoding.png">    


<br />
<br />

## 2、运算类指令    

<img src="Images/x86_Instructions_cate2.png">    


#### 示例:ADD指令(加):    

- 格式:    

ADD DST, SRC


- 操作:    
将两个操作数相加并把结果存放到第一个操作数(DST)当中去。    

- 注意:    
ADD指令会改变CF标志位。    

#### 示例:INC指令(加一):    

- 格式:    

INC OPR


- 操作:    
将操作数(OPR)加一。    

- 注意:    
INC指令编码很短,只需要一个字节。  
INC指令不会改变CF标志位。(DEC指令也不会)    

#### 示例:ADC指令(带进位的加):    

- 格式:    

ADC DST, SRC


- 操作:    
DST <- DST + SRC + CF  
两个操作数相加,再加上CF标志位,结果存放到第一个(DST)操作数中去。    

- 注意:    
ADC指令同样也会改变CF标志位。    


<br />
<br />

## 3、转移类指令    

<img src="Images/x86_Instructions_cate3.png">    

#### 示例:JNZ指令:    

- 格式:    

JNZ LABEL

- 操作:    
无进位时(CF=0)转移到标签位置。    


<br />
<br />

## 4、控制类指令      

<img src="Images/x86_Instructions_cate4.png">    

> 作用:    
> 1、控制CPU的功能。    
> 2、对标志位进行操作。    




# 复杂的x86指令    

## 1、串操作指令    

<img src="Images/x86_Instructions_complex_cate1.png">    

> 串操作指令作用:    
> 1、对存储器中的数据船进行每次一个元素的操作。      
> 2、串的基本单位是字节或者字(即"一个元素")。    

#### 示例:MOVSB指令和REP指令:    

- MOVSB格式    

MOVSB

- MOVSB的操作:    
在存储器中将指定位置的一个字节单元传送到另一个指定的位置。    

- REP格式:    

REP 串操作指令 ```

(END)