0%

Intel 8086の指令系统

Intel 8086中的指令按功能可分为六组:

① 数据传送;

② 算术运算;

③逻辑运算和移位;

④ 串操作;

⑤ 程序控制;

⑥ 标志操作和处理器控制。

数据传送指令

通用传送指令MOV

指令格式

MOV OPRD1,OPRD2OPRD1OPRD2分别表示目的操作数源操作数

指令功能

  • CPU内部寄存器之间数据的任意传送(除了CSIP以外)

  • 立即数传送至CPU内部的通用寄存器组(即AXBXCXDXBPSPSIDI

  • CPU内部寄存器(除了CSIP以外)与存储器(所有寻址方式)之间的数据传送

  • 立即数存储单元赋值

注意事项

  • MOV指令不允许对CSIP进行操作

  • 两个操作数中,除了立即寻址以外必须有一个为寄存器寻址方式,即两个存储器操作数之间不允许直接进行数据传送

  • 两个段寄存器之间不能直接传送数据,也不允许用立即寻址方式来为段寄存器赋初值

  • MOV指令不影响标志位

堆栈指令

堆栈操作总是字操作,包括入栈和出栈。

入栈指令PUSH

指令格式

PUSH OPRDOPRD为源操作数)

源操作数可以是CPU内部的16位通用寄存器段寄存器(除了CS以外)内存操作数(所有寻址方式);入栈操作对象必须是16位数

指令功能

将数据压入堆栈。

注意事项

入栈方向是由高地址向低地址进行。

出栈指令POP

指令格式

POP OPRDOPRD为目的操作数)

目的操作数可以是CPU内部的16位通用寄存器段寄存器(除了CS以外)内存操作数(所有寻址方式);出栈操作对象必须是16位数

指令功能

将数据弹出堆栈。

注意事项

不能从栈顶弹出一个字给CS,即CS不能作目的操作数

交换指令XCHG

指令格式

XCHG OPRD1,OPRD2

指令功能

完成数据交换。将一个字节或一个字的源操作数与目的操作数进行交换。

注意事项

  • 交换能在通用寄存器之间通用寄存器与存储器之间进行;

  • 段寄存器和立即数不能作为一个操作数

  • 不能在存储器与存储器之间交换数据

累加器专用传送指令

输入输出指令(IN,OUT)

Intel 8086通过输入输出指令与外设进行数据交换。

IN指令
指令格式

指令功能

IN指令允许将一个字节或一个字由一个输入端口传送到ALAX中;若端口地址超过255,则必须用DX保存端口地址。

注意事项

16位输入输出指令中的端口地址只能取偶地址。

OUT指令
指令格式

指令功能

ALAX中的数据输出到I/O端口。

地址传送指令

LEA

指令格式

LEA OPRD1,OPRD2

指令功能

将源操作数的地址偏移量传送至目的操作数,该指令通常用来建立串操作指令所需的寄存器指针。

注意事项
  • 源操作数必须是一个内存操作数;
  • 目的操作数必须是一个16位的通用寄存器。

算术运算指令

加法指令

ADD

指令格式

ADD OPRD1,OPRD2

指令功能

完成两个操作数相加(不带进位的加法),将结果送至目的操作数;目的操作数可以是累加器任意通用寄存器以及存储器操作数

注意事项

ADD指令对标志位CFDFPFSFZFAF有影响。

ADC

指令格式

ADC OPRD1,OPRD2

指令功能

带进位的加法;与ADD指令类似,但在两个操作数相加时,要将进位标志CF的值加上,再将结果送至目的操作数。

注意事项

ADC指令对标志位的影响与ADD指令相同。

INC

指令格式

INC OPRD

指令功能

完成对指定的操作数加1,然后返回此操作数;INC指令主要用于在循环程序中修改地址指针和循环次数

注意事项

INC指令执行的结果影响标志位AFOFPFSFZF,而对进位标志没有影响。

减法指令

SUB

指令格式

SUB OPRD1,OPRD2

指令功能

完成两个操作数相减(不考虑借位),并将结果送至目的操作数。

SBB

指令格式

SBB OPRD1,OPRD2

指令功能

与SUB指令类似,但在两个操作数相减时,还要减去借位标志CF的值

注意事项

SBB指令对标志位AFCFOFPFSFZF都有影响。

DEC

指令格式

DEC OPRD

指令功能

对指定的操作数减1,然后返回此操作数。

注意事项
  • 在相减时,将操作数作为一个无符号二进制数来进行操作;
  • 指令执行的结果影响标志位AFOFPFSFZF,但CF无影响

NEG

指令格式

NEG OPRD

指令功能

对操作数取2的补码,即相当于用0减去操作数,再将结果送回操作数。

注意事项
  • 若在字节操作时对-128,或在字操作时对-32768取补,则操作数无变化,但标志位OF置1
  • NEG指令影响标志位AFCFOFPFSFZF
  • 指令执行的结果一般总是使标志位CF置1,除非在操作数为0时,才使CF置0

CMP

指令格式

CMP OPRD1,OPRD2

指令功能

CMP指令用于比较两个数之间的关系,两个操作数相减(目的操作数减去源操作数),使结果反映在标志位ZF上,但并不返回结果。

  • 若两操作数相等,相减后结果为0,ZF置1,否则置0;

  • 若两操作数不相等,则可通过其他标志位的状态来确定两者的大小:

    • 若两个操作数为无符号数,则可根据标志位CF的状态来判断:

      • CF=0,则目的操作数大于或等于源操作数
      • CF=1,则目的操作数小于源操作数
    • 若两个操作数为有符号数,则可根据标志位OFSF来判断:

      • OFSF的值相同,则被减数比减数大;
      • OFSF的值不同,则被减数比减数小。

乘法指令

MUL

指令格式

MUL OPRD

指令功能

无符号数乘法指令,完成字节与字节相乘、字与字相乘,且默认的操作数放在ALAX中,源操作数由指令给出

注意事项
  • 8位数相乘,结果为16位数,放在AX中;
  • 16位数相乘,结果为32位数高16位放在DX低16位放在AX
  • 源操作数不能为立即数
  • 当结果的高半部分不为0,则CF=1OF=1;否则CF=0OF=0

IMUL

指令格式

IMUL OPRD

指令功能

带符号数乘法指令,与MUL指令类似。

注意事项

当结果的高半部分不是结果的低半部分的符号扩展时,标志位CFOF将置位;否则,标志位CFOF都置0。

除法指令

DIV

指令格式

DIV OPRD

指令功能

无符号数除法指令;在字节运算时,被除数放在AX中,商放在AL中,余数放在AH中;在字运算时,被除数为DXAX构成的32位数,商放在AX中,余数放在DX中。

注意事项

源操作数可为除立即寻址方式以外的任何一种寻址方式,且指令执行对所有标志位都无定义

IDIV

指令格式

IDIV OPRD

指令功能

带符号数除法指令;执行过程同DIV指令。

注意事项
  • 在IDIV指令中,操作数的最高位为符号位,运算结果商的最高位也为符号位
  • 在IDIV指令执行过程中,若商超出正常范围( -128 ~ +127 或 -32768 ~ +32767 ),则产生0号中断

逻辑运算指令

双操作数的逻辑运算指令中,必须有一个操作数为寄存器寻址方式,且目的操作数不能为立即数;同时会使CF=0OF=0AF无定义,而SFZFPF则根据运算结果而定。

NOT指令

指令格式

NOT OPRD

指令功能

对操作数求反,然后送回原处;操作数可以是寄存器或存储器内容。此指令对标志位无影响。

注意事项

NOT指令的操作数不能为立即数

AND指令

指令格式

AND OPRD1,OPRD2

指令功能

对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数;目的操作数可以是累加器任意通用寄存器内存操作数(所有寻址方式)源操作数可以是立即数寄存器内存操作数(所有寻址方式)

注意事项

AND指令可以进行字节操作,也可以进行字操作。

TEST指令

指令格式

TEST OPRD1,OPRD2

指令功能

完成与AND指令相同的操作,结果反映在标志位上,但并不送回

OR指令

指令格式

OR OPRD1,OPRD2

指令功能

对指定的两个操作数进行逻辑“或”运算;运算结果返回目的操作数。目的操作数可以是累加器任意通用寄存器内存操作数(所有寻址方式)源操作数可以是立即数寄存器内存操作数(所有寻址方式)

XOR指令

指令格式

XOR OPRD1,OPRD2

指令功能

对指定的两个操作数进行“异或”运算,结果送回目的操作数。目的操作数可以是累加器任意通用寄存器内存操作数(所有寻址方式)源操作数可以是立即数寄存器内存操作数(所有寻址方式)

移位指令

算术/逻辑移位指令

指令格式

(M为移位次数,可以是1CL

  • 算术左移指令:SAL OPRD,M

  • 逻辑左移指令:SHL OPRD,M

  • 算术右移指令:SAR OPRD,M

  • 逻辑右移指令:SHR OPRD,M

指令功能

寄存器操作数内存操作数进行指定的移位;可以进行字节操作或字操作。

循环移位指令

前两条循环指令未将标志位CF包含在循环体内;后两条循环指令将标志位CF包含在循环体内。

循环指令可以进行字节操作或字操作;操作数可以是寄存器操作数,也可以是内存操作数;可以循环移位一次,也可以由CL来决定循环移位的次数。

左移一位,只要左移后的数未超出一个字节或一个字的表达范围,则相当于原数乘以2;右移一位则相当于原数除以2。

串操作指令

  • 串操作指令可以用来实现内存区域的数据串操作;数据串可以是字节串,也可以是字串;
  • 源操作数用寄存器SI寻址,默认在数据段DS中;
  • 目的操作数用寄存器DI寻址,默认在附加段ES中;
  • 字串长度默认在CX中,存取或搜索的值默认在AL中;
  • 每执行一次串操作指令,SIDI将自动修改:
    • +1(对于字节串)或+2(对于字串);
    • -1(对于字节串)或-2(对于字串);
    • 执行CLD指令后,DF=0,地址指针增1或2;
    • 执行STD指令后,DF=1,地址指针减1或2。

重复指令前缀

串操作指令可以与重复指令前缀配合使用,从而可以使操作得以重复进行,及时停止。

串指令

MOVS指令

将数据段中由SI间接寻址的一个字节或一个字传送到附加段中由DI间接寻址的一个字节单元或一个字单元,然后根据DF及所传送数据的类型(字节或字)对SIDI进行修改,在指令重复前缀REP的控制下,可将数据段中的整串数据传送到附加段。该指令不影响标志位。

CMPS指令

将数据段中由SI间接寻址的一个字节或一个字与附加段中由DI间接寻址的一个字节或一个字进行比较操作,使比较的结果影响标志位,然后根据DF及所进行比较的操作数类型(字节或字)对SIDI进行修改,在指令重复前缀REPE/REPZREPNE/REPNZ的控制下,可在两个数据串中寻找第一个不相等的字节或字,或者第一个相等的字节或字。

SCAS指令

用由指令指定的关键字节或关键字(分别存放在ALAX中),与附加段中由DI间接寻址的字节串(或字串)中的一个字节(或字)进行比较操作,使比较的结果影响标志位,然后根据DF及所进行操作的数据类型(字节或字)对DI进行修改,在指令重复前缀REPE/REPZREPNE/REPNZ的控制下,可在指定的数据串中搜索第一个与关键字节(或字)匹配的字节(或字),或者搜索第一个与关键字节(或字)不匹配的字节(或字)。

STOS指令

将指令中指定的一个字节或一个字(分别存放在ALAX中),传送到附加段中由DI间接寻址的字节内存单元(或字内存单元),然后根据DF及所进行操作的数据类型(字节或字)对DI进行修改操作。在指令重复前缀的控制下,可连续将AL(或AX)的内容存入到附加段中的一段内存区域,该指令不影响标志位。

LODS指令

将数据段中由SI间接寻址的字节内存单元(或字内存单元)中指定的一个字节或一个字传送到AL(或AX)中,然后根据DF及所进行操作的数据类型(字节或字)对SI进行修改操作。在指令重复前缀的控制下,可连续将数据段中的一段内存区域中数据读入AL(或AX)中,该指令不影响标志位。

程序控制指令

程序控制指令用于实现程序分支、循环等程序结构,通过改变IP(和CS)的值,实现程序执行顺序的改变。

无条件转移指令JMP

JMP指令分为直接转移和间接转移两种:

  • 直接转移

  • 间接转移

条件转移指令

条件转移指令根据标志寄存器中各标志位的状态来决定程序是否进行转移。条件转移指令的目的地址必须在现行的CS,并且以当前IP的内容为基准,其位移必须在 +127 ~ -128 的范围内

  • 一个8位位移量,表示本条件转移指令后的那条指令的偏移地址到目标指令的偏移地址的地址位移;
  • 8位位移量是相对于当前IP的,且距当前IP地址 -128 ~ +127 个单元的范围之内,属于段内短距离转移。

条件转移指令不影响标志位,但要利用标志位

子程序调用和返回指令

当主程序需要执行子程序时,使用CALL调用指令转移到该子程序的起始处执行;当子程序执行完后,使用RET返回指令回到主程序继续执行。

调用指令CALL

返回指令RET

循环控制指令

该组指令主要通过判断CX或标志位ZF来确定是否循环。

中断指令

Intel 8086可以管理256个中断,各中断各用一个向量编号来区别;中断向量表( 0:0 ~ 0:3FFH )存放中断程序的入口地址。

标志操作和处理器控制指令

标志操作指令

标志操作指令用来控制标志位(主要为CFDFIF三个)。

处理器控制指令

处理器控制指令用来控制处理器的工作状态,不影响标志位。