1第3章8086/8088指令系统(Part1)movax,12hcalldisplayJmp1234h2本章主要内容•指令系统的一般概念•对操作数的寻址方式•六大类指令的操作原理及使用–操作码的含义–指令对操作数的要求–指令执行的结果33.1概述指令——控制计算机完成指定操作的命令指令系统——CPU的所有指令及其使用规则的集合机器指令——指令的二进制代码形式。例如:CD21H机器语言——机器指令系统+相应的语法规则汇编指令——指令的助记符形式。例如:INT21H汇编语言——汇编指令系统+相应的语法规则•为什么要学习8086汇编语言–对硬件控制最彻底、占内存少、运行速度快–了解计算机组成结构和工作过程的工具–8086指令系统是整个x86系列CPU指令的基本集合,向后兼容–应用广泛,资料易于寻找48086指令按功能分为六大类(1)数据传送类(2)算术运算类(3)逻辑运算和移位类(4)串操作类(5)控制转移类(6)处理器控制类53.1.1指令的基本语法说明要执行的是什么操作操作的对象,可以有0、1或2个可以是操作数本身,也可以是操作数的地址,或是一个地址表达式6指令格式举例:MOVAX,1000ADDAX,[SI+6]DECCXHLT7部分常用的8086指令指令类型助记符数据传送数据传送MOV,PUSH/POP,XCHG等地址传送LEA,LDS,LES输入输出IN,OUT算术运算加法ADD,ADC,INC减法SUB,SBB,DEC,CMP乘/除法MUL,DIV逻辑运算AND,OR,NOT,XOR,TEST移位SHL/SHR/SAR,ROL/ROR,RCL/RCR串操作MOVS,CMPS,SCAS,LODS,STOS控制转移JMP,JXX,LOOP,CALL/RET,INT/IRET8指令中的操作数(3种)1、立即数操作数(常数)取值范围如下:8位16位无符号数00H~FFH(0~255)0000H~FFFFH(0~65535)有符号数80H~7FH(-128~+127)8000H~7FFFH(-32768~+32767)注意:立即数只能用于源操作数,例如MOVAX,8000H;√正确!MOV8000H,AX;×错误!92、寄存器操作数8个通用寄存器和4个段寄存器(的内容)16位操作数:AX,BX,CX,DX,SI,DI,BP,SPCS,DS,ES,SS8位操作数:AH,AL,BH,BL,CH,CL,DH,DL注意:段寄存器的内容只能作为段基地址使用,不能用来进行运算。例如ADDDS,AX;×错误!103、存储器操作数注意:一般不允许两个操作数同时为存储器操作数例:MOV[SI],[1000H];×错误!类型占用存储单元个数字节1字2双字4指令中实际给出的是存储单元的地址,用[]括起来。如[1000H]、[BX]、[SI+10]等。一般情况下,只需给出段内偏移地址地址可以是直接的,也可以是间接的,还可以是地址表达式存储器操作数的类型(常用的有3种)11汇编语言中只使用逻辑地址(段地址和偏移地址)若指令中没有指出存放段地址的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段地址。表3.3段寄存器使用的一些基本约定CPU通过计算指令给出的地址表达式得到存储器操作数的偏移地址。例如,若BX=2000H,SI=0A00H,DI=2A00H,则以下指令的结果是一样的:MOVAL,[2A00H]MOVAL,[BX+0A00H]MOVAL,[BX][SI]MOVAL,[DI]12一条指令的执行时间=∑3.1.2指令的执行时间取指令时间取操作数时间执行指令时间保存结果时间单位用时钟周期数表示。表3.4常用指令执行时间结论:1)尽量使用寄存器作为操作数2)如果可能,用移位代替乘除法3)尽量使用简单的寻址方式13寻址方式—确定操作数地址的方法操作数的地址(一般指源操作数)要执行的下一条指令的地址在8086指令系统中,寻址方式可分为7种:①立即寻址⑤寄存器相对寻址②直接寻址⑥基址-变址寻址③寄存器寻址⑦相对的基址-变址寻址④寄存器间接寻址此外,还有一种隐含寻址。3.28086的寻址方式14操作数(为一常数)直接由指令给出(这种操作数又称之为立即数)注意:1.立即寻址只能用于源操作数2.源操作数和目的操作数的类型要一致例:MOVAX,1C8FHMOVBYTEPTR[2A00H],10001010BMOVCX,100MOV2A00H,AX;×错误!MOVBL,8000H;×错误!3.2.1立即寻址15立即数AX31H02H代码段代码段指令操作例:MOVAX,3102H执行后,AH=31H,AL=02H(AX=3102H)存储器MOV操作码02H31H······操作码低8位高8位立即寻址指令在存储器中的存放形式······163.2.2直接寻址指令中直接给出操作数的偏移地址偏移地址也称有效地址(EA,EffectiveAddress)段地址在默认的段寄存器中,但也可以显式地指定其他段寄存器(称为段超越前缀)偏移地址也可用符号地址来表示例:MOVAX,[2A00H]MOVDX,ES:[2A00H]MOVSI,Variable17AX指令操作例:MOVAX,[3102H]执行后:AH=0ABH,AL=0CDH(AX=0ABCDH)如果DS=2000H,(23102H)=0CDH,(23103H)=0ABH则操作数的物理地址为:20000H+3102H=23102HABHCDHMOV操作码02H31H23102HCDHABH存储器代码段数据段..23103H183.2.3寄存器寻址把寄存器中的内容作为操作数注意:1.源操作数与目的操作数字长要相同2.寄存器寻址与段地址无关例:MOVAX,BXMOV[3F00H],AXMOVCL,ALMOVAX,BL;×错误!MOVCX,ES:AX;×错误!19AX2233HSI指令操作例:MOVSI,AX假定指令执行前:AX=2233H指令执行后:AX=2233H,SI=2233H2233H203.2.4寄存器间接寻址操作数的偏移地址在寄存器中注意:只有SI、DI、BX和BP可作间址寄存器例:MOVAX,[BX]MOVCL,CS:[DI]MOVAX,[DX];×错误!MOVCL,[AX];×错误!EA=(BX)(BP)(SI)(DI)21指令操作例:MOVAX,[SI]假定DS=6000H,SI=1200H,(61200H)=44H,(61201H)=33H6000HDS1200HSI600061200AX+120044H33H44H33H61200H存储器数据段······61201H0指令执行结果:AX=3344H223.2.5寄存器相对寻址EA=间址寄存器的内容加上一个位移量寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)EA=(BX)(BP)(SI)(DI)+8位16位位移量例:MOVAX,[BX+8]MOVCX,TABLE[SI]MOVAX,[BP+1000H];默认段寄存器为SS23指令操作例:MOVAX,[BX+10]假定DS=6000H,BX=1000H,(61010H)=66H,(61011H)=55H指令执行结果:AX=5566H6000HDS1000HBX600061010AX+100066H55H66H55H61010H存储器数据段······61011H0(位移量)10243.2.6基址-变址寻址若操作数的偏移地址:由基址寄存器(BX或BP)给出——基址寻址方式由变址寄存器(SI或DI)给出——变址寻址方式由基址寄存器的内容和变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址。EA=(BX)(BP)+(SI)(DI)注意:同一组内的寄存器不能同时出现。25例:MOVAX,[BX][SI]MOVAX,[BX+DI]MOVAX,DS:[BP][DI]MOVAX,[BX][BP];×错误!MOVAX,[DI][SI];×错误!2622H指令操作例:MOVAX,[BX][SI]假定DS=8000H,BX=2000H,SI=10H,(82010H)=22H,(82011H)=11H指令执行结果:AX=1122H8000HDS2000HBX8000AX200022H11H22H11H82010H存储器数据段······82011H01082010+0010HSI273.2.7相对的基址-变址寻址在基址-变址寻址的基础上再加上一个相对位移量注意事项同基址-变址寻址EA=(BX)(BP)+(SI)(DI)+8位16位位移量例:MOVAX,BASE[SI][BX]MOVAX,[BX+BASE][SI]MOVAX,[BX+SI+BASE]28指令操作例:MOVAX,[DI+BX+10H]假定DS=8000H,BX=2000H,DI=50H,(82060H)=66H,(82061H)=55H82060H数据段......66H55H82061H存储器22H指令执行结果:AX=5566H8000HDS2000HBX8000AX200066H55H05082060+0050HDI(位移量)1029使用相对的基址-变址寻址方式可以很方便地访问二维数组。基址寄存器数组首地址变址寄存器数组元素行址段内位移量数组元素列址(偏移地址)二维数组例:内存图示(按行存储)(行位移地址)(行内元素下标)183252409A=30读取元素A(2,1)偏移地址=ABX=第2行的位移量=6SI=元素1的下标=1MOVBX,6MOVSI,1MOVAL,[A+BX+SI]···A(0,0)=1A(0,1)=8A(0,2)=3A(1,0)=2A(1,1)=5A(1,2)=2A(2,0)=4A(2,1)=0A(2,2)=9···第0行第1行第2行AA+1A+2A+3A+4A+5A+6A+7A+8存储器地址数组A在内存中的存放形式313.2.8隐含寻址操作数隐含,在指令中未显式地指明。例:“MULBL”指令的操作是指令中隐含了被乘数(在AL中)及乘积(在AX中)类似的指令还有:DIV、CBW、MOVS等。AL×BL→AX32寻址方式小结寻址方式操作数操作数形式立即寻址立即数常数寄存器寻址寄存器寄存器(无方括号)直接寻址存储器地址表达式:不含寄存器寄存器间接地址表达式:仅含一个寄存器(BX/BP/SI/DI之一)寄存器相对地址表达式:一个寄存器加上一个位移量基址—变址地址表达式:两个不同类别的寄存器相加相对基址-变址地址表达式:两个不同类别的寄存器相加再加上位移量333.38086指令系统包括如下6大类指令:数据传送指令算术运算指令逻辑运算和移位指令串操作指令程序控制指令处理器控制指令34指令的通用规则操作数不能是CS和IP除串操作指令外,其他指令的源和目的操作数不能都是存储器操作数源操作数和目的操作数不能都是段寄存器立即数不允许作为目的操作数源操作数和目的操作数的类型至少有一个能够确定。如果两个都能确定,则二者类型必须要一致。353.3.1数据传送指令可实现的操作仅AL/AX存储器常数寄存器段寄存器I/O接口数据传送指令又可分为如下四种:通用传送目标地址传送标志传送输入输出361.通用传送指令(1)MOV指令MOVdest,src;dest←src可实现8位或16位数据的传送。传送类型取决于指令中寄存器的位数。若两个操作数都不是寄存器,则应显式地指定目的操作数的类型。例:MOVCL,DL;8位传送MOVAX,[BX];16位传送MOV[SI],CL;8位传送MOVWORDPTR[BX+5],10H;16位传送37MOV指令使用规则:1)遵循通用规则2)不允许段寄存器之间的传送MOVES,DS;×错误!3)不允许立即数到段寄存器的传送MOVDS,1000H;×错误!38不能实现的传送的解决办法:用AX作桥梁存储器←存储器MOVAX,MEM1MOVMEM2,AX段寄