8086_8088_汇编_指令_手册

发布时间 : 星期三 文章8086_8088_汇编_指令_手册更新完毕开始阅读

8086 8088 汇编指令手册

通用寄存器

(1)数据寄存器

数据寄存器共有4个寄存器AX、BX、CX、DX,用来保存操作数或运算结果等信息。 AX寄存器称为累加器。使用频度最高,用于算术、逻辑运算以及与外设传送信息等。 BX寄存器称为基址寄存器。常用于存放存储器地址。

CX寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。

DX寄存器称为数据寄存器。常用来存放双字数据的高16位,或存放外设端口地址。 (2)变址和指针寄存器

变址和指针寄存器包括SI、DI、SP、BP 4个16位寄存器,主要用于存放某个存储单元的偏移地址。

SI是源变址寄存器。

DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。 SP为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址。

BP为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。 2.段寄存器

8086 CPU的4个16位的段寄存器分别称为代码段寄存器CS,数据段寄存器DS,堆栈段寄存器SS,附加数据段寄存器ES。

段寄存器用来确定该段在内存中的起始地址。 代码段用来存放程序的指令序列。

CS存放代码段的段首址,指令指针寄存器IP指示代码段中指令的偏移地址。 3.指令指针

8086 CPU中的指令指针IP,它总是保存下一次将要从主存中取出指令的偏移地址,偏移地址的值为该指令到所在段段首址的字节距离。在目标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。 3.1 标志寄存器

8086 CPU中有一个很重要的16位标志寄存器,它包含9个标志位,主要用于保存一条指令执行后,CPU所处状态信息及运算结果的特征。

条件标志 (1)进位标志CF (2)零标志ZF (3)符号标志SF (4)溢出标志 OF (5)奇偶标志 PF (6)辅助进位标志AF

状态控制标志 (1)方向标志DF (2)中断允许标志IF (3)追踪标志TF

运算结果标志位

1、进位标志CF(Carry Flag)

进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。 2、奇偶标志PF(Parity Flag)

奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可

靠性,如果采用奇偶校验的方法,就可使用该标志位 。 3、辅助进位标志AF(Auxiliary Carry Flag)

在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0: (1)在字操作时,发生低字节向高字节进位或借位时; (2)在字节操作时,发生低4位向高4位进位或借位时。

对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。 4、零标志ZF(Zero Flag)

零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。 5、符号标志SF(Sign Flag)

符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的

正负号。运算结果为正数时,SF的值为0,否则其值为1。 6、溢出标志OF(Overflow Flag)

溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否 则,OF的值被清为0。

常用指令

通用数据传送指令. MOV 传送字或字节 MOV OPRD1,OPRD2 功能: 本指令将一个源操作数送到目的操作数中,即OPRD1<--OPRD2 1. OPRD1 为目的操作数,可以是寄存器、存储器、累加器. OPRD2 为源操作数,可以是寄存器、存储器、累加器和立即数. 2. MOV 指令以分为以下四种情况: <1> 寄存器与寄存器之间的数据传送指令 <2> 立即数到通用寄存器数据传送指令 <3> 寄存器与存储器之间的数据传送指令 <4> 立即数到存储器的数据传送 3. 本指令不影响状态标志位 PUSH 把字压入堆栈 PUSH OPRD 功能: 实现压入操作的指令是PUSH指令; 1. OPRD为16位(字)操作数,可以是寄存器或存储器操作数. 2. PUSH的操作过程是: (SP)<--(SP)-2,((sp))<--OPRD 即先修改堆栈指针SP(压入时为自动减2),然后,将指定的操作数送入新的栈顶位置. 此处的((SP))<--OPRD,也可以理解为: [(SS)*16+(SP)]<--OPRD 或 [SS:SP]<--OPRD POP 把字弹出堆栈 POP OPRD 实现弹出操作的指令是POP指令 1. OPRD为16位(字)操作数,可以是寄存器或存储器操作数. 2. POP指令的操作过程是: POP OPRD:OPRD<--((SP)),(SP)<--(SP)+2 它与压入操作相反,是先弹出栈顶的数顶,然后再修改指针SP的内容. 3. 示例: POP AX POP DS POP DATA1 POP ALFA[BX][DI] 4. PUSH和POP指令对状态标志位没有影响 XCHG 交换字或字节 XCHG OPRD1,OPRD2 其中的OPRD1为目的操作数,OPRD2为源操作数 功能: 将两个操作数相互交换位置,该指令把源操作数OPRD2与目的操数OPRD1交换. 至少有一个操作数为寄存器,段寄存器不可作为操作数 1. OPRD1及OPRD2可为通用寄存器或存储器,但是两个存储器之间是不能用XCHG指令实现的. 2. 段寄存器内容不能用XCHG指令来交换. 3. 若要实现两个存储器操作数DATA1及DATA2的交换,可用以下指令实现: 示例: PUSH DATA1 PUSH DATA2 POP DATA1 POP DATA2 4. 本指令不影响状态标志位

输入输出端口传送指令. IN I/O端口输入 IN AL,n ;(AL)<--(n) IN AL,DX ;(AL)<--[(DX)] IN 1. 其中n为8位的端口地址,的内容送至AH中,端口地址n的内容送AL中. IN AX,n ;(AX)<--(n+1),(n) 当字节输入时,将端口地址n+1AX,DX ;(AX)<--[(DX)+1],[(DX)] 功能: 输入指令 2. 端口地址也可以是16位的,但必须将16位的端口地址送入DX中.当字节寻址时,由DX内容作端口地址的内容送至AL中; 当输入数据字时,[(DX)+1]送AH,[(DX)]送AL中,用符号:(AX)<--[(DX)+1],[(DX)]表示 OUT I/O端口输出 OUT n,AL ;(n)<--(AL) 功能: 输出指令 1. OUT n,AX ;(n+1),(n)<--(AX) OUT DX,AL ;[(DX)]<--(AL) OUT DX,AX ;[(DX)+1],[(DX)]<--(AX) 2. 输入指令及输出指令对标志位都不影响. 输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.

目的地址传送指令.

LEA 装入有效地址.

例: LEA DX,string ;把偏移地址存到DX. LDS 传送目标指针,把指针内容装入DS.

例: LDS SI,string ;把段地址:偏移地址存到DS:SI. LES 传送目标指针,把指针内容装入ES.

例: LES DI,string ;把段地址:偏移地址存到ESDI. LFS 传送目标指针,把指针内容装入FS.

例: LFS DI,string ;把段地址:偏移地址存到FSD. LGS 传送目标指针,把指针内容装入GS.

例: LGS DI,string ;把段地址:偏移地址存到GSDI. LSS 传送目标指针,把指针内容装入SS.

例: LSS DI,string ;把段地址:偏移地址存到SSDI.

算术运算指令

ADD 加法 ADD OPRD1,OPRD2 功能: OPRD1<-OPRD1 + OPRD2 CF、SF、OF、PF、ZF、AF 1.两个操作数类型匹配 2. OPRD1和OPRD2均为寄存器是允许的,一个为寄存器而另一个为存储器也是允许的, 但不允许两个都是存储器操作数. 该语句在ADD语句后才会有意义 ADC 带进ADC OPRD1,OPRD2

联系合同范文客服:xxxxx#qq.com(#替换为@)