1、数据传送指令 算术运算和逻辑运算指令 串操作指令 位操作指令 程序控制指令 处理器控制指令,2.23 80x86的指令集,常用指令的分类,随着处理器的升级, 不断扩充指令集 不断增强指令功能,2.23 80x86的指令集,指令集的扩充和增强,指令表示格式,标号 指令助记符 操作数1 , 操作数2 ;注释,对指令的了解,(1)指令的功能;(2)适用于指令的操作数寻址方式;(3)指令对标志的影响;(4)指令的长度和执行时间 。,2.23 80x86的指令集,传送指令,指令格式: MOV DST,SRC,2.24 数据传送指令,举例,说明,不影响标志 源操作数和目的操作数类型要一致。即同时为字节或字
2、或者双字。不能一个是字节,另一个是字或者双字。 除了串操作指令外,源操作数和目的操作数不能同时是存储器操作数。 对存储器操作数而言,可采用各种存储器寻址方式 。 立即数不能作为目标。 代码段寄存器情况特殊。,2.24 数据传送指令,交换指令,指令格式: XCHG OPRD1,OPRD2,说明,不影响标志 源操作数和目的操作数类型要一致。 除了串操作指令外,源操作数和目的操作数不能同时是存储器操作数。 对存储器操作数而言,可采用各种存储器寻址方式 。 立即数不能作为其操作数。,2.24 数据传送指令,地址传送指令(1)(Load Effective Address),指令格式: LEA REG,
3、OPRD,说明,该指令把操作数OPRD的有效地址传送到操作数REG。 操作数OPRD必须是一个存储器操作数,操作数REG必须是一个16位的通用寄存器。,举例,2.24 数据传送指令,地址传送指令(2),指令格式: LDS REG,OPRD,说明,该指令把操作数OPRD中所含的一个32位地址指针的段值部分送到数据段寄存器DS,把偏移部分送到指令给出的通用寄存器REG。操作数OPRD必须是一个32位的存储器操作数,操作数REG可以是一个16位的通用寄存器,但实际使用的往往是变址寄存器或指针寄存器。,2.24 数据传送指令,地址传送指令(2),LDS SI,FARPOINTER ;FARPOINTE
4、R是一个双字变量,2.24 数据传送指令,地址传送指令(3),指令格式: LES REG,OPRD,说明,类似于LDS REG,OPRD。,2.24 数据传送指令,堆栈和堆栈指针,SS:SP,堆栈的主要用途,(1)现场和返回地址的保护;(2)寄存器内容的保护;(3)传递参数;(4)存储局部变量。,2.25 堆栈操作指令,进栈指令,说明,不影响标志 源操作数SRC可以是通用寄存器和段寄存器,也可以是字存储单元 。 8086/8088CPU,SRC不可以是立即数,指令格式: PUSH SRC,2.25 堆栈操作指令,进栈操作示意,2.25 堆栈操作指令,出栈指令,说明,不影响标志 目的操作数DST
5、可以是通用寄存器和段寄存器(但CS例外),也可以是字存储单元。,指令格式: POP DST,2.25 堆栈操作指令,2.26 标志操作指令,标志传送指令,8086/8088指令集中,有一部分指令是专门对标志寄存器或标志位进行的,包括四条标志寄存器传送指令和七条专门用于设置或清除某些标志位的指令。,(1)指令LAHFLAHF,(2)指令SAHFSAHF,(4)指令POPFPOPF,(3)指令PUSHFPUSHF,标志位操作指令,(1)清进位标志指令 CLC (2)置进位标志指令 STC (3)进位标志取反指令 CMC(4)清方向标志指令 CLD (5)置方向标志指令 STD (6)清中断允许标志
6、指令 CLI (7)置中断允许标志指令 STI,2.26 标志操作指令,2.27 加减运算指令,具有加、减、乘和除四种基本算术运算操作指令。 这些操作都可用于字节或字的运算,也可以用于无符号数的运算或有符号数的运算。 有符号数用补码表示。 加减运算指令不再分为无符号数运算指令和有符号数运算指令,而乘除运算指令还分为无符号数运算指令和有符号数运算指令。,关于算术运算指令,加减运算指令对无符号数和有符号数的处理一视同仁。既作为无符号数而影响标志CF和AF,也作为有符号数影响标志OF和SF,当然总会影响标志ZF。加减运算指令也要影响标志PF。 只有通用寄存器或存储单元可用于存放运算结果。如果参与运算
7、的操作数有两个,则最多只能有一个是存储器操作数。 如果参与运算的操作数有两个,则它们的类型必须一致,即同时为字节,或同时为字。 存储器操作数可采用各种存储器寻址方式。,加减运算指令一般说明,2.27 加减运算指令,加减运算的操作数寻址方式示意,2.27 加减运算指令,加法指令,(1)一般加法指令ADD 格式: ADD DST,SRC 功能: 完成两个操作数相加,结果送至目的操作数DST, 即:DST DST + SRC,2.27 加减运算指令,加法指令,(2)带进位加指令ADC 格式: ADC DST,SRC 功能: 完成两个操作数相加,同时把进位标志CF的现行值加上去,把结果送至目的操作数D
8、ST。 即:DST DST + SRC + CF,2.27 加减运算指令,加法指令,(3)加1指令INC 格式: INC DST 功能: 这条指令完成对操作数DST加1,然后把结果送回DST,即:DST DST + 1 说明:不影响进位标志CF,2.27 加减运算指令,MOV AX,1234HMOV DS,AX ;置数据段寄存器值MOV SI,5678H ;置指针初值MOV AX,0 ;清32位累加和MOV DX,AXMOV CX,100 ;置数据个数计数器 NEXT: ADD AX,SI ;求和ADC DX,0 ;加上可能的进位INC SI ;调整指针INC SIDEC CX ;计数器减1J
9、NZ NEXT ;如果不为0,那么就继续累加下一个数据,2.27 加减运算指令,减法指令,(1)一般减法指令SUB 格式: SUB DST,SRC 功能: 从DST中减去SRC,结果送到目标操作数DST中 即:DST DST - SRC,2.27 加减运算指令,减法指令,(2)带借位减指令SBB 格式: SBB DST,SRC 功能: 在操作数DST减去操作数SRC的同时还要减借位(进位)标志CF的现行值。 即:DST DST - (SRC +CF),2.27 加减运算指令,减法指令,(3)减1指令DEC 格式: DEC DST 功能: 把操作数DST减1,并把结果送回DST。 即:DST D
10、ST 1 说明:不影响进位标志CF,2.27 加减运算指令,减法指令,(4)取补指令NEG 格式: NEG DST 功能: 对操作数取补,就是用零减去操作数DST。 即:DST 0 - DST,NEG CXNEG AL,2.27 加减运算指令,减法指令,(5)比较指令CMP 格式: CMP OPRD1,OPRD2 功能:将操作数OPRD1减去操作数OPRD2,运算结果不送到DST,但影响标志CF、ZF、SF、OF、AF和PF。,CMP SI,DICMP CL,5CMP DX,BP-4,2.27 加减运算指令,2.28 乘除运算指令,乘除运算指令分为无符号数运算指令和有符号数运算指令两类。 乘除
11、运算指令对标志位的影响有些特别,不象加减运算指令对标志位的影响那样自然。 对操作数有一些特别的规定。,关于乘除运算指令,乘法指令,(1)无符号数乘法指令MUL 格式: MUL OPRD 功能:如果OPRD是字节操作数,则把AL中的无符号数与OPRD相乘,16位结果送到AX中;如果OPRD是字操作数,则把AX中的无符号数与OPRD相乘,32位结果送到DX和AX对中,DX含高16位,AX含低16位。所以由操作数OPRD决定是字节相乘,还是字相乘。,MUL BLMUL CX,2.28 乘除运算指令,乘法指令,(2)有符号数乘法指令IMUL 格式: IMUL OPRD,2.28 乘除运算指令,除法指令
12、,(1)无符号数除法指令DIV 格式: DIV OPRD 功能:如果OPRD是字节操作数,则把AX中的无符号数除以OPRD,8位的商送到AL中,8位的余数送到AH;如果OPRD是字操作数,则把DX(高16位)和AX中的无符号数除以OPRD,16位的商送到AX,16位的余数送到DX中。所以由操作数OPRD决定是字节除,还是字除。,DIV BLDIV CX,2.28 乘除运算指令,关于除法运算的溢出,除数为0 商太大,2.28 乘除运算指令,除法指令,(2)有符号数除法指令IDIV 格式: IDIV OPRD,符号扩展指令,(1)字节转换为字指令CBW (2)字转换为双字指令CWD,2.28 乘除
13、运算指令,2.29 逻辑运算和移位指令,逻辑运算包括:与、或、否、异或。 除了否指令NOT外,均有两个操作数。这两个操作数的寻址方式类似于算术运算指令。最多只能有一个为存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放运算结果。 操作数可以是字节,也可以是字。但如果有两个操作数,则它们的类型必须一致,即同时为字节,或同时为字。 清进位标志CF(NOT指令例外)。,关于逻辑运算指令,逻辑运算指令介绍,(1)否操作指令NOT 格式: NOT DST,NOT BLNOT CX,2.29 逻辑运算和移位指令,逻辑运算指令介绍,(2)与操作指令AND 格式: AND DST,SRC,A
14、ND CX,SIAND DL,0FHAND AX,ES:BX,2.29 逻辑运算和移位指令,逻辑运算指令介绍,(3)或操作指令OR 格式: OR DST,SRC,OR BX,SIOR AL,20HOR CX,DS:BP+2,2.29 逻辑运算和移位指令,逻辑运算指令介绍,(4)异或操作指令XOR 格式: XOR DST,SRC,XOR AX,DXXOR BX,BX,2.29 逻辑运算和移位指令,逻辑运算指令介绍,(5)测试指令TEST 格式: TEST OPRD1,OPRD2 功能:类似指令AND,把两个操作数进行按位“与”,但结果不送到操作数OPRD1,仅仅影响标志。该指令执行以后,标志ZF
15、、PF和SF反映运算结果,标志CF和OF被清0。,TEST AX,8080HTEST AL,BX,2.29 逻辑运算和移位指令,移位指令包括:一般移位和循环移位指令两类。 被移位的操作数可以是通用寄存器或存储器操作数,可以是字节,也可以是字。 8086/8088中,移位的位数是1,或者由CL给出。,关于移位指令,2.29 逻辑运算和移位指令,关于一般移位指令,2.29 逻辑运算和移位指令,一般移位指令介绍,(1)算术左移或逻辑左移指令 格式: SAL OPRD,mSHL OPRD,m,SHL BL,1SHL AX,CL,2.29 逻辑运算和移位指令,一般移位指令介绍,XOR AH,AH ;(A
16、H)=0SHL AX,1 ;2XMOV BX,AX ;暂存2XSHL AX,1 ;4XSHL AX,1 ;8XADD AX,BX ;8X+2X,2.29 逻辑运算和移位指令,一般移位指令介绍,(2)算术右移指令SAR 格式: SAR OPRD,m,SAR BL,1SAR AX,CL,2.29 逻辑运算和移位指令,一般移位指令介绍,(3)逻辑右移指令SHR 格式: SHR OPRD,m,SHR BL,1MOV CL,4 SHR AX,CL,2.29 逻辑运算和移位指令,关于循环移位指令,2.29 逻辑运算和移位指令,循环移位指令介绍,(1)循环左移指令 ROL OPRD,m (2)循环右移指令
17、ROR OPRD,m (3)带进位循环左移指令 RCL OPRD,m (4)带进位循环右移指令 RCR OPRD,m 说明:m是移位次数,或为1或为CL。操作数OPRD可以是通用寄存器,也可以是存储器操作数。,2.29 逻辑运算和移位指令,问题,(1)可采用哪些方法将寄存器AX清0? (2)可采用哪些方法使寄存器SI的高8位与低8位互换? (3)有哪些方法可判定寄存器DL的内容为0? (4)有哪些方法可判定寄存器AL的最高位为1?,(1)无条件转移指令和条件转移指令; (2)循环指令; (3)过程调用和过程返回指令; (4)软中断指令和中断返回指令。,关于改变执行流的指令,2.30 转移指令,
18、根据转移的范围:段内转移和段间转移 根据表示转移目标的方式:直接转移和间接转移 (1)无条件段内直接转移; (2)无条件段内间接转移; (3)无条件段间直接转移; (4)无条件段间间接转移。,无条件转移指令的分类,2.30 转移指令,无条件转移指令,(1)无条件直接转移指令 格式: JMP 标号,NEXT: MOV AX,CXJMP NEXT ;转NEXT处JMP OVER ;转OVER处OVER: MOV AX,1,2.30 转移指令,无条件转移指令,(2)无条件段间直接转移指令 另一种格式: JMP FAR PTR 标号,JMP FAR PTR LAB2,2.30 转移指令,无条件段内直接
19、转移指令的机器指令格式:,地址差的范围 一个字节的范围:-126-129 一个字的范围:-32765-32770。,这属于相对转移,便于代码浮动。,2.30 转移指令,无条件转移指令,无条件段间直接转移指令的机器指令格式:,这属于绝对转移。,2.30 转移指令,无条件转移指令,(3)无条件间接转移指令 格式: JMP OPRD 功能:无条件转移的地址到由操作数OPRD的内容给定。操作数OPRD可以是通用寄存器,也可以是字存储单元。,JMP CX;ADD AX,AXMOV BX,AXJMP BX+100,2.30 转移指令,无条件转移指令,(4)无条件段间间接转移指令 格式: JMP OPRD功
20、能:无条件转移的地址到由操作数OPRD的内容给定。操作数OPRD必须是双字存储单元。,JMP DWORD PTR BX,2.30 转移指令,无条件转移指令,(3)无条件段内间接转移指令,2.30 转移指令,8086/8088提供了大量的条件转移指令,它们根据某标志位或某些标志位的逻辑运算来判别条件是否成立。如果条件成立,则转移,否则继续顺序执行。 所有条件转移都只是段内转移。 条件转移也采用相对转移方式。即通过在IP上加一个地址差的方法实现转移。但条件转移指令中只用一个字节表示地址差,所以,如果以条件转移指令本身作为基准,那么条件转移的范围在-126至+129之间。如果条件转移的目标超出此范围
21、,那么必须借助于无条件转移指令。 条件转移指令不影响标志。 往往有多个助记符。,关于条件转移指令,2.30 转移指令,条件转移指令同时利用的标志,根据一个标志判别; 根据两个标志判别; 根据三个标志判别。,JC LAB1JAE LAB2JLE LAB3,2.30 转移指令,例1.写个程序,从键盘上读入两个无符号数a,b,使用汇编指令完成从大到小排序后输出,2.30 转移指令,例2.写个程序,从键盘上读入两个有符号数a,b,使用汇编指令完成从大到小排序后输出,循环指令类似于条件转移指令,不仅属于段内转移,而且也采用相对转移的方式,即通过在IP上加一个地址差的方式实现转移。循环指令中也只用一个字节表示地址差,所以,如果以循环指令本身作为基准,那么循环转移的范围在-126至+129之间。 循环指令不影响各标志。,关于循环指令,2.30 转移指令,循环指令,(1)计数循环指令LOOP 格式:LOOP 标号 功能:使寄存器CX的值减1,如果结果不等于0,则转移到标号,否则顺序执行LOOP指令后的指令。 指令功能类似与:DEC CXJNZ 标号,2.30 转移指令,2.30 转移指令,LOOPZ/ LOOPE LOOPNZ /LOOPNE JCXZ采用LOOP指令计算:1+2+3+100的累计和,