目录
一、 寻址方式
一条指令通常由操作码+操作数两大部分组成。
寻址方式:寻找指令中所需操作数的各种方法,也就是提供指令中操作数的存放信息的方式。
Intel 8086/8088 各指令中提供操作数的方法包括以下四种:
- 立即数操作数——操作数在代码中提供
- 寄存器操作数——操作数在CPU的通用寄存器或段寄存器中
- 存储器操作数——操作数在内存的存储单元中
- I/O端口操作数——操作数在输入/输出接口的寄存器中
1. 立即数寻址
立即数寻址方式的指令中,所需操作数直接包含在指令代码中,这种操作数称为立即数。立即数可以是8位,也可以是16位。立即数只能作为源操作数,而不能作为目的操作数。
例如:MOV AH, 20H,它表示将8位立即数20H送入AH中。
在指令执行过程中,立即数作为指令的一部分直接从BIU的指令队列中取出,不另外占用总线周期,因此该寻址方式执行速度快。
2. 寄存器寻址
指令中所需的操作数在CPU的某个寄存器中。寄存器可以是8位或16位通用寄存器, 或者是段寄存器。
例如: MOV AX, BX。
存取寄存器操作数完全在CPU内部进行,不需要总线周期,所以执行速度很快。
分割线:
以下寻址方式其操作数都是在存储器中。我们知道一个存储单元的逻辑地址由段基址+偏移量表示。其中段基址由段寄存器提供,偏移量表示该存储单元与段起始地址之间的距离,也被称作有效地址EA。
EA是以下三种分量的几种组合,由EU计算得到。
- 位移量:位移量是指令中直接给出的一个8位或16位数。一般源程序中以操作数名字(变量名或标号)的形式出现。
- 基址:由基址寄存器BX或基址指针BP提供的内容。
- 变址:由源变址寄存器SI或目的变址寄存器DI提供的内容
位移量、 基址和变址三个地址分量组合时,若有两个或两个以上分量时,将进行以2^16为模的十六位加法运算。根据四种组合方式有四种寻址方式。
3. 直接寻址
操作数的有效地址EA只包含位移量地址分量。
直接寻址方式可以用符号或常数来表示:
- 用符号表示:MOV BX, VAR => MOV BX, DS: VAR。它表示将数据段中,偏移了VAR个字节距离的字单元内容送到寄存器BX中。
- 用常数表示:MOV AX, DS: [64H]。它表示从当前数据段开始,偏移100个字节的字单元内容送到AX中。用常数表示时,必须用方括号括起来。段寄存器不能省略。
4. 寄存器间接寻址
EA直接从基址寄存器(BX或BP)或变址寄存器(SI或DI)中获得。
寄存器间接寻址就是事先将偏移量存放在某个寄存器(BX、BP、 SI或DI)中,这些寄存器就如同一个地址指针。在程序运行期间,只要对寄存器内容进行修改,就可以实现用同一条指令实现对不同存储单元进行操作。
段寄存器的隐含使用规则:当指令中使用的是BP寄存器,则隐含表示使用SS段寄存器,其余情况则隐含使用DS段寄存器。
例如:MOV AX, [BX] => MOV AX, DS: [BX];MOV BH, [BP] => MOV BH, SS: [BP];MOV [DI], BX => MOV DS: [DI], BX
5. 基址寻址/变址寻址
EA等于基址分量或变址分量加上指令中给出的位移量。
指令中使用BX或BP时为基址寻址。指令中使用SI或DI时为变址寻址。
段寄存器的隐含使用规则与寄存器间接寻址方式相同
6. 基址变址寻址
EA=基址+变址+位移量
例如: MOV CX, 100H[BX][DI]; MOV TABLE[BX][DI], AX
7. 串操作寻址
- 在寻找源操作数时,隐含使用SI作为地址指针。
- 在寻找目的串时,隐含使用DI作为地址指针。
- 在串操作完成之后, 自动对SI和DI进行修改,使它们指向下一个操作数。
8. I/O端口寻址
在计算机系统,对I/O端口的寻址方式分为两种:
存储器编址方法:将I/O端口视作存储器的一个单元,访问存储器的指令和各种寻址方式同样适用对I/O端口的访问。特点是程序设计灵活,但需要占用存储地址空
I/O端口编址方法:I/O端口的地址与存储器地址分开,并使用专门的输入指令和输出指令。
- 直接端口寻址——在指令中直接给出端口地址,端口地址一般采用2位十六进制数,也可以用符号表示。直接端口寻址可访问的端口数为0~255个。例如: IN AL, 25H
- 寄存器间接端口寻址——把I/O端口的地址先送到DX中,用DX作间接寻址寄存器。如果访问的端口地址值大于255,则必须用I/O端口的间接寻址方式。
二、指令系统
Intel8086/8088CPU指令系统的指令可以分为六大类: 1.传送类指令 2.算术运算类指令 3.位操作类指令4.串操作类指令 5.程序转移类指令 6.处理器控制类指令
1. 传送类指令
传送类指令的作用是将数据信息或者地址信息传送到一个寄存器或存储单元中。
1.1 通用数据传送指令
指令格式: MOV DEST, SRC,作用: 将源操作数指定的内容传送到目的操作数,即DEST<=(SRC)。
当指令执行完后,目的操作数原有的内容被源操作数内容覆盖,即目的操作数和源操作数具有相同内容。
MOV指令可以是字节数据传送也可以是字数据传送,但是源操作数和目的操作数的长度必须一致。
MOV指令可以分为以下情况:
MOV指令需要注意:
- 立即数只能作源操作数,且它不能传送给段寄存器。
- 段寄存器CS只能作源操作数,段寄存器之间不能直接传送。
- 存储单元之间不能直接传送数据。
- MOV指令不影响标志位。
1.2 交换指令
指令格式: XCHG DEST, SRC。作用:源操作数和目的操作数两者内容相互交换,即: (DEST) <=>(SRC)。
XCHG指令需要注意:
- 数据交换可以在寄存器之间或寄存器与存储器单元之间进行,且只能使用通用寄存器。
- 不能在存储单元之间直接进行数据交换。
- 不影响标志位。
为了完成两个存储单元(DA_BYTE1和DA_BYTE2)之间的数据交换可以使用一个中间寄存器,通过三条指令来实现。
1.3 标志传送指令
- 取标志寄存器指令:LAHF,将标志寄存器的低8位送入AH寄存器。即将标志SF、 ZF、 AF、 PF和CF分别送入AH的第7、 6、 4、 2、 0位,而AH的第5、 3、 1位不确定。
指令执行后对标志寄存器无影响。 - 存取标志寄存器指令:SAHF,将寄存器AH中的第7、 6、 4、 2、 0位分别送入标志寄存器的SF、 ZF、 AF、 PF和CF各标志位。
- 标志进栈指令:PUSHF
- 标志出栈指令:POPF
1.4 地址传送指令
1.4.1 装入有效地址
LEA DEST, SRC,作用:将SRC存储单元地址中的偏移量,即有效地址EA传送到一个16位通用寄存器中。
源操作数SRC必须是一个字节或字存储器操作数(地址), DEST必须是一个16位通用寄存器。
指令执行对标志寄存器各位无影响。
比较指令 LEA BX, DS:[23H]与 MOV BX, DS:[23H]的功能
1.4.2 装入地址指针指令
LDS DEST, SRC;LES DEST, SRC
DEST是任意一个16位通用寄存器。 SRC必须是一个存储器操作数。
作用:把SRC存储单元开始的4个字节单元的内容(32位地址指针)送入DEST通用寄存器和段寄存器DS( LDS指令)或ES( LES指令),其中低字单元内容为偏移量送通用寄存器, 高字单元内容为段基值送DS或ES。
例: LDS SI, TABLE[BX],设 TABLE的值为0A02H, (BX)=34H,(DS)=2030H
2. 算术运算类指令
2.1 加法指令
ADD DEST, SRC。即DEST<=(DEST)+(SRC)。
- 根据相加的结果将影响到标志寄存器的CF、 PF、AF、 ZF、 SF和OF
- DEST只能是通用寄存器或存储器操作数。不能是立即数
- SRC可以是通用寄存器、存储器或立即数操作数
- DEST和SRC不能都为存储器操作数
- ADD指令可以是字节操作数相加,也可以是字操作数相加
2.2 带进位加法指令
ADC DEST, SRC
结果还要加上进位标志CF的值,即DEST<=(DEST)+(SRC)+CF,参加运算的进位CF是本条指令执行之前的值。用ADC指令可实现数据长度大于16位的两数相加
例:计算12349678H+377425H
指令执行后,结果的高16位在AX,低16位在BX中。
2.3 加1指令
INC DEST,即DEST<=(DEST)+1
- 目的操作数可以是任意的8位、 16位通用寄存器或存储器操作数。目的操作数被视为带符号二进制数
- 根据指令执行结果设置PF、 AF、 ZF、 SF和OF标志, 但不影响CF。 INC指令主要用于某些计数器的计数和修改地址指针。
2.4 减法指令
SUB DEST, SRC,即DEST<=(DEST)-(SRC)
- 操作结果将影响标志位CF、 PF、 AF、 ZF、 SF和OF。
- 目的操作数DEST和源操作数SRC可以是8位或16位的通用寄存器、存储器操作数,但两者不能同时为存储器操作数。
- 立即数只能作源操作数。
2.5 带借位减法
SBB DEST, SRC,即: DEST<=(DEST)-(SRC)-CF。
同样,CF是本条指令执行前的结果。
2.6 减1指令
DEC DEST,即: DEST<=(DEST)-1
- DEST可以是8位或16位的通用寄存器存储器操作数,该指令将DEST看作是带符号二进制数。
- 根据指令执行结果设置PF、 AF、 ZF、 SF和OF,但不影响CF。
2.7 求负数指令(取补指令)
NEG DEST
3. 位操作类指令
3.1 逻辑运算指令
- 逻辑“与”指令 AND DEST, SRC
- 逻辑“或”指令 OR DEST, SRC
- 逻辑“异或”指令 XOR DEST, SRC
- 逻辑“非”指令 NOT DEST
DEST和SRC可以是8位或16位的通用寄存器或存储器操作数, 但两者不能同时为存储器操作数。
逻辑运算指令除用来实现各种逻辑运算之外, 还常用于对字节或字数据的某些位的组合、分离或位设置,如:
3.2 测试指令
TEST DEST, SRC
实现源操作数与目的操作数进行按位“逻辑与”运算, 对标志位的影响与AND指令相同, 但运算的结果不送入目的操作数,主要用于测试某一操作数的一位或几位的状态。
3.3 位移、循环移位指令
3.3.1 算术移位
- 算术左移 SAL DEST, COUNT
- 算术右移 SAR DEST, COUNT
3.3.2 逻辑移位
- 逻辑左移 SHL DEST, COUNT
- 逻辑右移 SHR DEST, COUNT
3.3.3 循环移位
- 循环左移 ROL DEST, COUNT
- 循环右移 ROR DEST, COUNT
- 带进位循环左移 RCL DEST, COUNT
- 带进位循环右移 RCR DEST, COUNT
4. 处理器控制类指令
4.1 标志位操作指令
- 清除进位标志 CLC ;置CF为0
- 置1进位标志 STC ;置CF为1
- 进位标志取反 CMC ; CF的值取反
- 清除方向标志 CLD;置DF为0
- 置1方向标志 STD;置DF为1
- 清除中断标志 CLI;置IF为0
- 置1中断标志 STI;置IF为1
4.2 与外部事件同步的指令
- HLT ;暂停指令
- WAIT ;等待指令
- ESC ;外部协处理器指令前缀
- LOCK ;总线锁定指令
4.3 空操作指令
NOP,执行一次NOP占用CPU三个时钟周期,它不改变任何寄存器或存储单元内容,主要用于延时