8086(8088)指令手册 - 图文

更新时间:2023-10-31 08:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

8086/8088指令手册

郑治强整理 2007-4-3

8086/8088指令手册

目 录

8086/8088指令分类

一、数据传送类指令…………………………………………………………第3页

1. 通用数据传送指令???????????????????????? 第3页 2.目标地址传送指令?????????????????????????第4页 3.标志位传送指令??????????????????????????第5页 4.I/O数据传送指令????????????????????????? 第5页

二、算术运算类指令

1. 加法指令???????????????????????????? 第6页 2.减法指令?????????????????????????????第7页 3.乘法指令?????????????????????????????第8页 4.除法指令?????????????????????????????第9页 5.十进制调整指令??????????????????????????第10页

三、逻辑运算和移位循环类指令……………………………………………第12页 四、操作类指令………………………………………………………………第14页 五、程序控制指令……………………………………………………………第15页 六、处理器控制类指令………………………………………………………第16页

名词表

表一、微机系统………………………………………………………………第17页 表二、8086/8088 CPU的内部结构………………………………………第18页 表三、数据寄存器的隐含使用………………………………………………第19页 表四、标志寄存器……………………………………………………………第20页

- 2 -

8086/8088指令手册

8086/8088指令分类

8086/8088的指令按功能可分为6类:数据传送、算术运算、逻辑运算、串操作、程序控制和CPU控制。

(一) 数据传送类指令

数据传送类指令可完成寄存器与寄存器之间、寄存器与存储器之间以及寄存器与I/O端口之间的字节或字传送,它们所具有的共同特点是不影响标志寄存器的内容。这类指令又可分成4种类型。

1. 通用数据传送指令 类型 格式与功能 MOV d,s ;d←s 即将由源s指定的源操作数送到目标d其中,s表示源,d表示目标。 应用举例 MOV AX,0 ;AX清0,字传送 MOV AL,12H ;AL←12H,字节传送 MOV AH,AL ;AH←AL,字节传送 MOV DS,AX ;DS←AX,字传送 MOV AL,BUFFER ;AL←内存单元BUFFER中的字节内容 MOV AX,[SI] ;AX←SI间址指示的内存两单元中的字内容 错误:MOV 2000H,1000H 错误:MOV CS,2000H PUSH AX PUSH BX PUSH DI PUSH SI ;SP-2→SP 备注 由s与d可分别指定源操作数与目标操作数。源操作数可以是8/16位寄存器、存储器中的某个字节/字或者是8/16位立即数;目标操作数不允许为立即数,其他同源操作数。且两者不能同时为存储器操作数。 PUSH s 将源操作数(16位)压入堆栈 通用数据POP d 传送将堆栈中当前栈指令 顶两相邻单元的数据字弹出到d。 XCHG d,s 该指令功能是将源操作数与目标操作数(字节或字)相互对应交换位置。 XLAT 这是一条用于实现字节翻译功能的指令,又称为代码转换指令。

POP SI ;SP+2→SP POP DI POP BX POP AX XCHG AX,[SI+0400H] CS=1000H, IP=0064H, DS=2000H, SI=3000H, AX=1234H 执行后将把AX寄存器中的1234H与物理地址23400H(=DS×16+SI) 这是两条进栈与出栈指令,其中,s和d可以是16位寄存器或存储器两相邻单元,以保证堆栈按字操作。 交换可以在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存储器之间进行。但不能在两个存储单元之间交换,段寄存器与IP也不能作为一个源或目的操作数。 具体地说,它可以将AL寄存器中设定的的一个字节数值变换为内存一段连续表格中的另一个相应的代码,以实现编码制的转换。 - 3 -

8086/8088指令手册

2.目标地址传送指令 类型 格式与功能 LEA d,s 这是取有效地址指令,其功能是把用于指定源操作数(它必须是存储器操作数)的16位偏移地址(即有效地址)传送到一个指定的16位通用寄存器中。 目标地址传送指令 这是一类专用于8086/8088中传送地址码的指令,可传送存储器的逻辑地址(即存储器操作数的段地址或偏移地址)至指定寄存器中 LDS d,s 这是取某变量的32位地址指针的指令,其功能是从由指令的源s所指定的存储单元开始,由4个连续存储单元中取出某变量的地址指针(共4个字节),将其前两个字节(即变量的偏移地址)传送到由指令的目标d所指定的某16位通用寄存器,后两字节(即变量的段地址)传送到DS段寄存器中。 应用举例 备注 将16位有效地址装入任何一个16位通用寄存器,这条指令常用来建立串操作指令所需要的寄存器指针。 将32位地址指针装入任何一个16位通用寄存器及DS或ES段寄存器。 LES d,s 这条指令与LDS d,s指令的操作基本相同,其区别仅在于将把由源所指定的某变量的地址指针中后2个字节(段地址)传送到ES段寄存器,而不是DS段寄存器。 - 4 -

8086/8088指令手册

3.标志位传送指令 类型 格式与功能 LAHF 将标志寄存器F的低字节(共包含5个状态标志位)传送到AH寄存器中。 SAHF 将AH寄存器内容传送到标志寄存器F的低字节。 PUSHF 将16位标志寄存器F内容入栈保护。其操作过程与前述的PUSH指令类似。 POPF 将当前栈顶和次栈顶中的数据字弹出送回到标志寄存器F中。

4.I/O数据传送指令 类型 格式与功能 IN累加器,端口号 端口号可以用8位立即数直接给出;也可以将端口号事先安排在DX寄存器中,间接寻址16位长端口号(可寻址的端口号为0~65535)。IN指令是将指定端口中的内容输入到累加器AL/AX中 OUT 端口号,累加器 与IN指令相同,端口号可以由8位立即数给出,也可由DX寄存器间接给出。OUT指令是将累加器AL/AX中的内容输出到指定的端口

应用举例 IN AL,PORT ;AL←(端口PORT) IN AX,PORT ;AX←(端口PORT) IN AL,DX ;AL←(端口(DX)) IN AX,DX ;AX←(端口(DX)) 备注 注意:I/O指令只能用累加器作为执行I/O数据传送的机构,而不能用其他寄存器代替。另,当用直接I/O指令时,寻址范围仅为0~255,这适用于较小规模的微机系统;当需要寻址大于255的端口地址时,则必须用间接寻址的I/O指令。例如,在IBM PC/XT微机系统中,既用了0~255范围的端口地址,也用了255~65535范围的端口地址。 应用举例 备注 标志位传送指令 用于传送标志位 I/O数据传送指令 OUT PORT,AL ;端口PORT←AL OUT PORT,AX ;端口PORT←AX OUT DX,AL ;端口(DX)←AL OUT DX,AX ;端口(DX)←AX - 5 -

8086/8088指令手册

(二) 算术运算类指令

算术运算类指令能对无符号或有符号的8/16位二进制数以及无符号的压缩型/非压缩型(又称为装配型/拆开型或组合型/未组合型)十进制数进行运算,有加、减、乘、除以及十进制调整5类指令。

1. 加法指令 类型 格式与功能 ADD d,s ;d←d+s 将源操作数与目标操作数相加,结果保留在目标中。并根据结果置标志位。 应用举例 备注 源操作数可以是8/16位通用寄存器、存储器操作数或立即数;目标操作数不允许是立即数,其他同源操作数。且不允许两者同时为存储器操作数。 指令的操作过程与ADD指令基本相同,惟一的不同是进位标志位CF的原状态也将一起参与加法运算,待运算结束,CF将重新根据结果置成新的状态。 目标操作数可以是8/16位通用寄存器或存储器操作数,但不允许是立即数。 ADC d,s 加;d←d+s+CF 法带进位加法。 指令 INC d ;d←d+1 将目标操作数当作无符号数,完成加1操作后,结果仍保留在目标中。

- 6 -

8086/8088指令手册

2.减法指令 类型 格式与功能 SUB d,s;d←d-s 将目标操作数减去源操作数,其结果送回目标,并根据运算结果置标志位。 SBB d,s ;d←d-s-CF 带借位减法 应用举例 备注 操作数可以是8/16位通用寄存器、存储器操作数或立即数;目标操作数只允许是通用寄存器或存储器操作数。并且,不允许两个操作数同时为存储器操作数,也不允许做段寄存器的减法。 本指令与SUB指令的功能、执行过程基本相同,唯一不同的是完成减法运算时还要再减去进位标志CF的原状态。运算结束时,CF将被置成新状态。 目标操作数可以是8/16位通用寄存器和存储器操作数,但不允许是立即数。 目标操作数可以是8/16位通用寄存器或存储器操作数。 NEG指令是把目标操作数当成一个带符号数,如果原操作数是正数,则NEG指令执行后将其变成绝对值相等的负数(用补码表示);如果原操作数是负数(用补码表示),则NEG指令执行后将其变成绝对值相等的正数。 源操作数可以是8/16位通用寄存器、存储器操作数或立即数;目标操作数只可以是8/16位通用寄存器或存储器操作数。但不允许两个操作数同时为存储器操作数,也不允许做段寄存器比较。比较指令使用的寻址方式与前面介绍过的加法和减法指令相同。 当判断两比较数的大小时,应区分无符号数与有符号数的不同判断条件:对于两无符号数比较,只需根据借位标志CF即可判断;而对于两有符号数比较,则要根据溢出标志OF和符号标志SF两者的异或运算结果来判断。 DEC d ;d←d-1 减1:将目标操作数的内容减1后送回目标。 NEG d ;d←d+1 NEG是一条求补码的指令,简称求减补指令。 法指令功能:将目标指操作数取负后送令 回目标。 CMP d,s ;d-s 只置标志位 指令功能:将目标操作数与源操作数相减但不送回结果,只根据运算结果置标志位。

- 7 -

8086/8088指令手册

3.乘法指令 类型 格式与功能 MUL s 无符号乘法指令,它完成两个无符号的8/16位二进制数相乘的功能。 应用举例 备注 被乘数隐含在累加器AL/AX中; 指令中由s指定的源操作数作乘数,它可以是8/16位通用寄存器或存储器操作数。相乘所得双倍位长的积,按其高8/16位与低8/16位两部分分别存放到AH与AL或DX与AX中去,即对8位二进制数乘法,其16位积的高8位存于AH,低8位存于AL;而对16位二进制数乘法,其32位积的高16位存于DX,低16位存于AX。 对于两个带符号的数相乘,如果简单采用与无符号数乘法相同的操作过程,那么会产生完全错误的结果。为此,专门设置了IMUL指令。 IMUL指令除计算对象是带符号二进制数以外,其他都与MUL是一样的,但结果不同。 IMUL指令对OF和CF的影响是:若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1。它仍然可用来判断相乘的结果中高一半是否含有有效数值。另外,IMUL指令对其他标志位没有定义。 乘法指令 用来实现两个二进制操作数的相乘运算,包括两条指令:无符号数乘法指令MUL和有符号数乘法指令IMUL。 IMUL s 有符号乘法指令,它完成两个带符号的8/16位二进制相乘的功能。

- 8 -

8086/8088指令手册

4.除法指令 类型 格式与功能 DIV s 指令完成两个不带符号的二进制相除的功能。 应用举例 备注 被除数隐含在累加器AX(字节除)或DX、AX(字除)中。指令中由s给出的源操作数作除数,可以是8/16位通用寄存器或存储器操作数。 对于字节除法,所得的商存于AL,余数存于AH。对于字除法,所得的商存于AX,余数存于DX。根据8086的约定,余数的符号应与被除数的符号一致。 若除法运算所得的商数超出累加器的容量,则系统将其当作除数为0处理,自动产生类型0中断,CPU将转去执行类型0中断服务程序作适当处理,此时所得商数和余数均无效。在进行类型0中断处理时,先是将标志位进堆栈,IF和TF清0,接着是CS和IP的内容进堆栈;然后,将0、1两单元的内容填入IP,而将2、3两单元的内容填入CS;最后,再进入0号中断的处理程序。 具体地说,如果源操作数是字节/字数据,被除数应为字/双字数据并隐含存放于AX/DX、A X中。如果被除数也是字节/字数据在AL/AX中,应将AL/AX的符号位(AL7)/(AX15)扩展到AH/DX寄存器后,才能开始字节/字除法运算,运算结果商数在AL/AX寄存器中,AL7/AX15是商数的符号位;余数在AH/DX中,AH7/DX15 是余数的符号位,它应与被除数的符号一致。允许的最大商数为+127/+32767,最小商数为-127/-32767。 它们在使用时应安排在IDIV指令之前,执行结果对标志位没有影响。 CBW指令将AL的最高有效位D7扩展至AH,即:若AL的最高有效位是0,则AH=00;若AL的最高有效位为1,则AH=FFH。该指令在执行后,AL不变。 CWD指令将AX的最高有效位D15扩展形成DX,即:若AX的最高有效位为0,则DX=0000H;若AX的最高有效位为1, 则DX=FFFFH。该指令在执行后,AX不变。 符号扩展指令常用来获得除法指令所需要的被除数。例如AX=FF00H,它表示有符号数-256;执行CWD指令后, 则DX=FFFFH,DX、AX仍表示有符号数-256。 除法指令 执行两个二进制数的除法运算,包括无符号二进制数除法指令DIV和有符号二进制数除法指令IDIV两条指令。 IDIV s 该指令完成将两个带符号的二进制数相除的功能。它与DIV指令的主要区别在于对符号位处理的约定,其他约定相同。 CBW和CWD 两条专门为IDIV指令设置的符号扩展指令,用来扩展被除数字节/字为字/双字的符号,所扩充的高位字节/字部分均为低位的符号位。 - 9 -

8086/8088指令手册

5.十进制调整指令 类型 格式与功能 DAA 加法的十进制调整指令,它必须跟在ADD或ADC指令之后使用。 功能:将存于AL寄存器中的2位BCD码加法运算的结果调整为2位压缩型十进制数,仍保留在AL中。 应用举例 备注 AL寄存器中的运算结果在出现非法码(1010B~1111B)或本位向高位(指BCD码)有进位(由AF=1或CF=1表示低位向高位或高位向更高位有进位)时,由DAA自动进行加6调整。 由于DAA指令只能对AL中的结果进行调整,因此,对于多字节的十进制加法,只能从低字节开始,逐个字节地进行运算和调整。 减法是加法的逆运算,对减法的调整操作是减6调整。 十进制调整指令 8086专门为完成十进制数运算而提供的一组十进制调整指令。 DAS 减法的十进制调整指令,它必须跟在SUB或SBB指令之后,将AL寄存器中的减法运算结果调整为2位压缩型十进制数,仍保留在AL中。 AAA 加法的ASCII码调整指令,也是只能跟在ADD指令之后使用。其功能是将存于AL寄存器中的1位ASCII码数加法运算的结果调整为1位非压缩型十进制数, 仍保留在AL中;如果向高位有进位(AF=1),则进到AH中。 调整过程与DAA相似,其具体算法如下: ① 若AL的低4位是在0~9之间,且AF=0,则跳过第②步,执行第③步。 ② 若AL的低4位是在0AH~0FH之间,或AF=1,则AL寄存器需进行加6调整,AH寄存器加1,且使CF=1。 ③ AL的高4位虽参加运算,但不影响运算结果,无需调整,且清除之。 AAS 减法的ASCII码调整指令,它必须跟在SUB或SBB指令之后,用来将AL寄存器中的减法运算结果调整为1位非压缩型十进制数;如有借位,则保留在借位标志CF中。 - 10 -

本文来源:https://www.bwwdw.com/article/p7h2.html

Top