




已阅读5页,还剩126页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章80X86/Pentium指令系统,2.180X86/Pentium指令格式和寻址方式,2.28086/8088指令系统,2.380X86/Pentium指令系统,本章重点及难点,指令格式;寻址方式;X86的基本指令集;,第二章80X86/Pentium指令系统,指令系统:微机处理器所能执行的各种指令的集合,不同的微处理器有不同的指令系统。对80X86/Pentium:8086、8088指令系统为基本指令系统286、386、486、Pentium在此基础上进行了扩充:8086/8088基本指令的增强及一些专用指令构成X86/Pentium系列的实模式指令集。系统控制指令对保护模式的多任务、存贮器管理、保护机制提供了控制能力。,2.1.1指令格式,2.180X86/Pentium指令格式和寻址方式,1.汇编指令:助记符形式的指令。如:MOVAX,BX,机器语言指令的特点,2.机器指令:指令的二进制代码形式。如:89D8H,(1)构成,(2)各部分具体说明,操作码:由CPU设计人员定义,每一种操作唯一对应一个操作码。例:加法操作助记符ADD;数据传送操作助记符MOV;比较操作助记符CMP;操作数:可由编程人员采用不同方式给出。,(3)指令格式:指令中对操作码、操作数的编码方式。,有效地址EA:从段的首地址到操作数所在地址的距离,用字节数表示,是一个无符号16位整数,它指向段首地址开始的64KB空间。,操作码与寻址方式字节(opcode及Modr/m部分)构成,第二字节:Reg.编码(23=8)表示一个具体的Reg.操作数,字节或字已由W决定,目的或源由D决定。mod编码表示另一个操作数是在Reg.中还是在存贮器中。11为Reg.,其他为存贮器。r/m当mod11时,r/m指出第二个Reg.操作数的编码。mod11时,r/m指出存贮器操作数存放地址的计算方法。,0,1,2,3,4,5,6,7,W,D,OPCodemodRegr/m,REG,Reg的确定,r/m的确定,源,目的,机器码存放在内存中,11001111,00000010,例1.ADDCL,BH(两个Reg相加)机器语言:00000010|11001111,OPCode,D目的操作数是寄存器,W字节运算,Mod第二个操作数在寄存器中,Reg.目的寄存器为CL,r/m源寄存器为BH,DISP,1.OPCode规定指令的操作类型,同时还指出:操作数类型Reg.操作数传送方向Reg.编码符号扩展2.modr/m和s-i-b寻址字段:规定Reg./MEM操作数的寻址方式.其中,modr/m是主寻址字节:规定操作数存放的位置r/m及存贮器操作数有效地址EA的计算方法。s-i-b是比例-变址-基址寻址字节:此字节可有可无,按主寻址字节编码而定.3.disp位移量字段:存贮器操作数段内偏移地址的一部分,为:0、1、2、4个字节。4.data立即数字段:指明立即数的大小。当8位与16/32位操作数一起使用时,CPU自动将它扩展为符号相同的16/32位数。,现在回顾一下X86/Pentium指令格式:,5.前缀字段用于修改指令操作的某些属性段超越前缀:将前缀中指明的段Reg.取代指令中默认的段Reg.重复前缀:串操作时置于指令前面,提高CPU处理串数据的速度总线锁定前缀Lock:用于产生Lock信号,防止其他总线主控设备中断CPU在总线上的传输操作。操作数宽度前缀:改变当前操作数宽度的默认值(由汇编程序自动设定)地址宽度前缀:改变当前地址宽度的默认值(由汇编程序自动设定),所有字段只有操作码字段是必需的,其他字段均可有可无。,前缀的编码为一个字节,在一条指令前可同时使用多个指令前缀,不同前缀的前后顺序无关紧要。,2.1.2寻址方式,操作数位置:1.操作数在指令中,与代码存放在一起,称为立即操作数。立即寻址2.操作数在Reg.中,指令中操作数部分是对应Reg.的编码。Reg.寻址3.操作数在MEM中,指令中操作数部分是操作数所在的内存地址。存贮器寻址,一、寻址方式与有效地址的概念寻址方式寻找操作数(操作数地址)的方式。依据寻址方式,可方便地访问到各类操作数。,存贮器寻址时,指令的操作数部分给出的地址是段内偏移地址。为了处理各种数据结构的需要,这个段内偏移量可以由几个基本部分组成,故称其为有效地址EA。,经管理部件换算成32位PA,对保护方式ES通过段管理部件形成32位段基地址线性地址段基地址TABLE,如:ES:TABLE对实地址方式ES是段基地址,TABLE为偏移量。PAES16TABLE,有效地址EA由四个分量组成:EA基址Reg(变址Reg比例因子)位移量四个分量的取值规定,对于16位寻址和32位寻址有所不同。,1.立即寻址操作数包含在指令中,紧跟着操作码并与操作码一起存放在代码段中;与代码一起被取入CPU的指令队列,在指令执行时不需要再访问存贮器。,立即操作数可以是8、16、32位,若是16或32位的,则存放时必须满足低对低,高对高的原则。指令中的立即数只能是源,不能是目的。常用于给Reg.赋初值。,二、各种寻址方式(对8086/8088(16位寻址)只有8种,对80386、486、Pentium(32位寻址)有11种),例:INCSIMOVAX,BXMOVECX,EAX,3.存储器寻址操作数在存贮区中,操作数的有效地址EA在指令中。操作数的物理地址PADS16EA(或SS、ES),Reg是任何CPU中的通用RegAX,BX,CXBPAH,AL等操作数在Reg中,无需访问存贮器,执行速度快。若选用AX,执行指令时间更短。,2.寄存器寻址操作数存放在指令规定的8、16或32位Reg中,Reg名字出现在指令中。,指令执行后,源操作数不变,目的操作数为源的内容。,(1)直接寻址(EA立即数)有效地址EA直接在指令中给出,它存放在代码段操作码之后。操作数一般在数据段DS中,这是一种默认方式。,将ES段中2000H、2001H单元内容分别送AL,AH(低对低,高对高)不管数据在那个段内存放,只要不是DS,一定要加段超越前缀。,允许段超越例:MOVAX,ES:2000H(或ES:MOVAX,2000H),例:MOVAL,2000H;将DS段中2000H单元的内容送AL若DS4000H,则物理地址为:4000H16+2000H42000H。见右图.,直接寻址中EA可以以变量名的形式给出。例:VALUEDB12HMOVAL,VALUE;VALUE又称为符号地址,Reg使用规定如下:16位寻址时,EA在DI、SI、BP、BX中,这时:若以DI、SI、BX间接寻址,则默认操作数在数据段中。操作数物理地址DS16BX(或SI、DI)若以BP间接寻址,则默认操作数在堆栈段内。操作数物理地址SS16BP若操作数不在以上规定段内,则必须在指令中加上段超越前缀。,(2)Reg间接寻址操作数的有效地址EA在指令的Reg中,即:EA(Reg),例:MOVAX,SI;将DS段SISI1的内容送AL,AHMOVBH,BP;将SS段BP的内容送BHMOVCX,ES:BX;将ES段BXBX1内容送CL,CH,寄存器间接寻址示意图,32位寻址时,8个32位通用Reg均可作Reg间接寻址。例:MOVCH,EAXMOVDX,EBXMOVCH,EBPMOVDX,ESP,除EBP、ESP默认SS为段Reg外,其余Reg默认DS,这种默认也可以允许段超越。,例:MOVAX,BX设DS4000H,BX=0100H寄存器间接寻址示意图如左。,(3)基址寻址EA(基址Reg)位移量位移量在指令中给出并与代码一起存放在代码段中。Reg使用规定如下:16位寻址时BP、BX作基址Reg,其中BP默认在SS段,BX默认在DS段,位移量是8或16位,且跟在操作码之后存放在代码段中。,32位寻址时,除ESP外,其余7个32位通用Reg均可作变址Reg,且EBP以SS为默认段Reg,其余以DS为默认段Reg。例:MOVEAX,5EBPMOVECX,DATAEAX,32位寻址时Reg的使用规定同前述(5)(4)(3)中。,注:当一种寻址方式中,基址、变址Reg的默认段Reg不同时,一般由基址Reg来决定默认段Reg,并允许段超越。,例:MOVAX,BXSI(或MOVAX,BXSI)默认DS为段Reg。MOVEAX,EDXEBP默认SS为段Reg。,(8)带位移量的基址加变址寻址(又称为相对基址变址寻址)EA(基址Reg)(变址Reg)位移量有16位及32位寻址两种,基址Reg与变址Reg的规定同前,对段Reg的默认同前。,例:MOVAH,MASKBXDIPADS16BXSIMASK示意图见右方,(9)带位移量的基址加比例变址寻址EA(基址Reg)(变址Reg)比例因子位移量各种规定与默认同前。,三、存贮器寻址时的段约定存贮器寻址时,一般并不在指令中给出段Reg,而是遵寻一种约定(默认)方式。,(只适用于32位寻址情况),例:MOVAX,EDI8ECX40或MOVAX,EDI8ECX40,2.28086/8088指令系统,8086/8088指令系统是80X86的基本指令集。指令的操作数宽度是8位或16位,偏移地址宽度是16位。,指令操作数符号说明规定如下页表所示:,共有14条指令,分为4组,见表3-4。,除了SAHF和POPF指令外,其余指令执行后对标志位都没有影响。,一、通用数据传送指令共5条,它们(除XCHG外)是唯一允许以Sreg作为操作数的指令。,OPRD2OPRD1两者可以是8/16位,但必须等长。,MOV指令有如下一些形式:MOVreg/Sreg,regMOVreg,SregMOVreg/Sreg,memMOVmem,reg/SregMOVreg,immMOVmem,imm,例:MOVAL,CH;通用寄存器之间传送字节数据MOVDS,AX;通用寄存器段寄存器(CS不能是目标)MOVAX,0FF3BH;立即数通用寄存器MOVAL,BUFFER;存储器通用寄存器MOVDATBP+DI,ES;段寄存器存储器MOV1000H,25H;立即数存储器MOVCX,1000H;存储器通用寄存器,2堆栈操作指令PUSH/POP,堆栈是按照LIFO原则组织的一段内存区域。80X86规定堆栈设置在堆栈段(SS)内,用SP始终指向堆栈的顶部。堆栈用于在子程序调用或处理中断时,保存当前的断点地址(在8086/8088中为CS和IP)和现场数据,以便子程序执行完毕后,正确返回到主程序。,指令格式:PUSHOPRD2POPOPRD1,源操作数:通用Reg,Sreg,mem目标操作数:通用Reg,Sreg(CS除外),mem,断点地址的保存由子程序调用指令或中断响应来完成(机器做);现场数据保存可通过堆栈操作指令来实现。,堆栈操作时,一定是16位操作。,具体的入/出栈指令如下:PUSHreg16;POPreg16PUSHSreg;POPSregPUSHmem16;POPmem16,指令格式:PUSHOPRD2;SPSP-2;(SP1),(SP)OPRD2POPOPRD1;OPRD1SP;SPSP2,指令PUSHAX的执行情况,注:1.程序中有一个PUSH,必有一个对应的POP。2.遵循后进先出原则。3.按字进行操作(PUSHAH;POPBL(错误)4.PUSHCS;POPCS(可以)(错误),3交换指令XCHG,例:XCHGAX,BXXCHG2530H,CX,注:1.两个存储器操作数之间不能实现直接交换。2.段Reg和立即数不能作为操作数。,指令格式:XCHGOPRD1,OPRD2;OPRD1OPRD2;OPRD1、OPRD2可以是reg,mem,4查表转换指令XLAT(或称换码指令),指令格式:XLAT;ALBX+AL或XLATOPRD;完成一个字节的查表转换,将BX+AL做为有效地址EA,在一个表格中找出相应单元内容放入AL。此指令常用来将一种代码转换为另一种代码。使用方法如下:,将待转换的代码组成表格,首地址BX,AL存放查找对象在表中下标,指令执行后,BX+ALAL,BX内容不变。,注:1.代码表须建立在数据段。2.代码表长度不超过256字节。3.执行指令前,BX表首址AL查找对象在表中距首址的偏移量(下标)。4.XLAT中的操作数通常为码表首地址的名称。相应指令部分:MOVBX,OFFSETS-TABMOVAL,4XLATS-TAB,例:将数字09的BCD码转换为7段LED显示器的显示代码。,MOVBX,0800HMOVAL,4XLAT;AL19H,数字09的BCD码对应的7段LED显示代码为:40H,79H,24H,30H,19H,12H,02H,78H,00H,18H。将它们依次存放在偏移地址为0800H开始的内存区域。则实现BCD码0100B转换的程序段为:,分析运算符,取地址偏移量,数据传送类指令共有14条指令,分为4组。,除了SAHF和POPF指令外,其余指令执行后对标志位都没有影响。,例:LEAAX,2728H;AX=2728HLEABX,BP+SI;BX=BP+SI的值。LEASP,0482H;SP=0482H,二、地址传送指令(指令中的源操作数都必须是mem操作数),注:MOV指令与LEA的不同:前者传送操作数的内容,后者传送操作数的地址。,例:MOVDI,TABLE;DITABLELEADI,TABLE;DITABLE所在单元的EA,例:比较LEABX,BUFFERMOVBX,BUFFER两指令的不同,存储单元内容如右图所示。DS:093AH,BUFFER物理地址093C3H则LEABX,BUFFER后,BX=0023HMOVBX,BUFFER后,BX=0045H,功能:将由源操作数偏移地址决定的双字单元中的第一个字的内容送入指令指定的16位通用寄存器,第二个字的内容传送给段寄存器DS或ES。,reg16EADSEA+2,例2:LDSSI,10H设指令执行前,DS=C000H,C0010H=0180H,C0012H=2000H则执行后,SI=0180H,DS=2000H,例3:LDSBX,DI+1008H程序执行前,DS=2500H,DI=2400H,28408H=3344H,2840AH=1122H执行后,BX=3344H,DS=1122H,例1:LDSDI,2130HEA=2130H2130H,2131HDI2132H,2133HDS,三、标志位传送指令标志位传送指令专门用于对标志寄存器(FR)的保护和更新操作。指令的操作数隐含。,PUSHFPOPAXORAH,01HPUSHAXPOPF,1LAHF/SAHF(读写标志寄存器)指令LAHF用于将FR的低字节(含SF、ZF、AF、PF和CF)读出后传送到AH寄存器。这条指令本身不影响标志位。,SAHF与LAHF的操作相反。将寄存器AH中的内容写入FR的低字节,取代某些标志位(SF、ZF、AF、PF和CF)的原来状态。,在子程序调用或中断子程序中,常用此保护和恢复需要的标志位。,四、输入/输出数据传送指令IN/OUT,CPU用16根I/O地址线形成64K个8位数据传送端口地址。当传送16位数据时,形成32K个16位端口地址。,当端口地址256(8根地址线)时,该地址直接出现在指令中。当端口地址256(816根地址线)时,该地址置于DX并将DX放在指令中。,指令格式:IN累加器,外设口地址OUT外设口地址,累加器,注:1.所有I/O指令只能用累加器,不能用其他Reg.2.IN/OUT指令有字/字节两种方式,选用那一种则取决于外设端口宽度。,具体指令有:INAL,imm8OUTimm8,ALINAX,imm8OUTimm8,AXINAL,DXOUTDX,ALINAX,DXOUTDX,AX,例:INAX,20H;从端口20H输入16位数到AXMOVDX,3F0HINAL,DX;从端口03F0H输入8位数到ALOUT27H,AL;将8位数从AL输出到端口27HOUTDX,AX;将16位数从AX输出到DX指定的端口,8086/8088在存储器中存放数的方法:num1单元中有一个16位数1234H,num2单元中有一个32位数12345678H。存放方式如右图:,2.2.2算术运算类指令(共20条),压缩BCD数:一个字节099非压缩BCD数:一个字节09,1.加减法类指令(1)加减法指令ADD/SUB指令格式:ADDOPRD1,OPRD2SUBOPRD1,OPRD2;OPRD1OPRD1OPRD2功能:完成两个操作数的加/减运算,结果送入目标操作数。源(Reg,mem,imm),目标(Reg,mem),且两个操作数不能同时为mem.,例:设AX65A0H,BX=B79EH执行ADDBX,AX具体执行情况如下:,一.二进制算术运算指令,特征:所有的算术类指令都影响Flag,这些标志可用于测试,以决定程序的走向。,2.算术运算指令与标志,例:两个4字节数分别放在FIRST和SECOND开始的存储区中,存放时,最低字节在地址最低处,可用以下程序段实现相加。,MOVAX,WORDPTRFIRST;取第一个加数的低16位ADDAX,WORDPTRSECOND;与第二个加数低16位相加,如有进位,则CF=1MOVWORDPTRTHIRD,AX;存低16位的和MOVAX,WORDPTRFIRST+2;ADCAX,WORDPTRSECOND+2;高16位相加,同时加上CFMOVWORDPTRTHIRD+2,AX;存高16位的和,(2)带进位、借位的加减法指令ADC/SBB指令格式:ADCOPRD1,OPRD2SBBOPRD1,OPRD2;OPRD1OPRD1OPRD2CF主要用于多精度(即多于两个字节以上)运算。,低位的CF对高位有贡献,低位的OF无意义,高位运算的OF才为整个的OF。,用于高字(字节)相加减,例:INCCX;CX寄存器中的内容加1DECBX;(此指令有不确定性),例:实现100-AL。NEGALADDAL,100,(5)比较指令CMP指令格式:CMPOPRD1,OPRD2;OPRD1-OPRD2,但不送回;其所影响的标志,可用于决定程序所做处理。,(4)求补指令NEG(做减法时用)指令格式:NEGOPRD;OPRD0-OPRD对一个数求补得到它相反数的补码(即按位求反+1)。当OPRD0时,CF=0;OPRD0,CF=1;且对-128,-32768求补时,操作数无变化。,(3)增量和减量指令INC/DEC指令格式:INCOPRD;OPRDOPRD1DECOPRD;此指令不影响CF.,减去一个数可以转化为加上它的求补值。X补-Y补=X补+-Y补=X补+Y求补,常用于修改地址指针,具体指令为:CMPreg,regCMPmem,regCMPmem,immCMPreg,memCMPreg,imm,比较指令在程序中常用于条件转移指令之前,条件转移指令根据CMP操作之后设置的标志状态决定转移或不转移。,注:此时不能用SF位判断,例:CMPAL,BL;ALBL,保持寄存器的值不变JNZEQUAL;若ZF0(不等),转EQUAL处;ZF1(相等)情况下的处理,注意:因为判断无符号数和有符号数大小的条件不同,所以条件转移指令也分为无符号数和有符号数两类不同的条件转移指令。这两组转移指令之间的区别是前者根据标志CF来判断,后者是根据SFOF的值来判断。,2乘除法类指令(1)乘法指令MUL/IMUL指令格式:MULOPRD(无符号数相乘)IMULOPRD(带符号数相乘);AXALreg8,ALmem8;(DX,AX)AXreg16,AXmem16,该指令只出现源操作数(可以是Reg,mem),目标操作数隐含。,此指令由于为乘积保留了两倍于原操作数的存储空间,因而不会出现溢出。,(2)除法指令DIV/IDIV指令格式:DIVOPRDIDIVOPRD,此指令只影响OF,CF,其余标志位为任意值。当CF=OF=1,表明乘积为16位或32位,高半部分不为0。CF=OF=0,表明乘积为8位或16位,高半部分为低8位的符号扩展。,ALAX/OPRD的商,AHAX/OPRD的余数。AX(DX,AX)/OPRD的商,DX(DX,AX)/OPRD的余数。,指令执行后,所有标志位状态不确定。对DIV:若商超过存放它的Reg容量(字节相除时为FFH,字相除时为FFFFH),则引起0型中断(除法出错),且商和余数不定。对IDIV:商的符号根据代数符号规则确定,余数的符号与被除数相同。,特点:操作数隐含在累加器中(AL,AX)操作:将操作数从字节字(AX);字双字(DX,AX)。,二、符号扩展指令CBW/CWD,例1:对8位机,-3为11111101对16位机,-3为1111111111111101对8位机,+3为00000011对16位机,+3为0000000000000011,例2:设AL=B4H,(无符号数180,带符号数-76)BL=11H,(无符号数17,带符号数17)用MULBL,则AX=0BF4H(无符号数3060),CF=OF=1而用IMULBL,则AX=FAF4H(带符号数-1292),CF=OF=1,例3:完成无/有符号数除法DP1/DP2无:XORAH,AHMOVAL,DP1DIVDP2;商在AL中,余数在AH中有:MOVAL,DP1CBW;扩展到字IDIVDP2,例4:DP1是字型变量,DP2和DPSUM是双字型变量,则要区分它们是无符号数还是有符号数(求和)。,符号数:MOVAX,DP1CWD/字转换成双字DX-AXADDAX,WORDPTRDP2MOVWORDPTRDPSUM,AXADCDX,WORDPTRDP2+2MOVWORDPTRDPSUM+2,DX,无符号数:MOVAX,DP1ADDAX,WORDOPTRDP2MOVWORDPTRDPSUM,AXMOVAX,0ADCAX,WORDPTRDP2+2MOVWORDPTRDPSUM+2,AX,三、BCD(十进制)算术运算指令,BCD算术运算:算术运算后紧接着用一条调整指令校正。所有调整指令隐含操作数在累加器中。,例:非压缩BCD数的加减运算。DX(UP1+1:UP1)+(UP2+1:UP2)-(UP3+1:UP3),MOVAL,UP1ADDAL,UP2;个位先加AAA;调整低位和为非压缩BCDMOVDL,AL;暂存DLMOVAL,UP1+1ADCAL,UP2+1;十位相加,且考虑个位CFAAA;调整高位和为非压缩BCDXCHGAL,DL;互换后AL为低位和,DL为高位和SUBAL,UP3;求低位差AAS;调整XCHGAL,DL;差存DL,AL现为高位和SBBAL,UP3+1;带借位减AASMOVDH,AL;存入DX,3非压缩BCD数乘除法调整指令AAM/AAD指令格式:AAM/AAD,AAM紧跟在MUL指令之后,能把在AX中的两个非压缩BCD数相乘的结果进行调整,得到正确的非压缩BCD的乘积(高位在AH中,低位在AL中)。调整操作为:AHAX/0AH;AX被0AH除的商AHALAX0AH;AX被0AH除的余数AL,2.2.3逻辑运算与移位指令,一、逻辑运算根据操作数的位组合格式,有选择地使某些位置位、复位或进行测试等。,特征:所有逻辑运算使CF=OF=0;ZF、PF、SF由运算结果决定,AF为不确定标志。,特点:AND、OR用于某些位置、复位。(两个非压缩BCD压缩BCD)自己“与”/“或”自己,操作数不变,但可清CF(即CF=0).XOR:与“0”异或不变,与“1”异或取反。判2个数哪些位相同?自己“异或”自己,操作数清零且CF=0。,二、移位与循环移位指令,功能与AND相同,但不送回结果,通过被影响的标志来判断操作数的情况。,格式:SAL/SAR/SHL/SHR操作数,1;移1位SAL/SAR/SHL/SHR操作数,CL;移位(CL)次移位之后改变操作数内容,但CL的值不变!允许的操作数类型:通用寄存器、存储器对标志位的影响:移出位CF;按照移位后的结果设置其它标志位。,例2:AH、AL中分别存有非压缩BCD数,用下列指令可转化为压缩的BCD数,并存于AL中:MOVCL,4SHLAL,CLSHRAX,CL,功能1.所有指令(8条)更新CF,其余标志位由运算结果决定。2.可部分地替代乘除法指令:将数扩大或缩小2的n次。3.乘以2的n次时,用算术/逻辑左移皆可(有/无符号数)。除以2的n次时,无符号数用逻辑右移,有符号数用算术右移。4.可分离出操作数中的某些位。,2.2.4串操作指令,串地址连续的字节或字存储单元,通常用于存放同一类数据。数据源:源串;数据结果:目的串。串操作对串中的每一项都执行的操作。如:串传送、查找、比较等。串操作指令对串元素实现传送、比较、检索、装入、存储等操作,并自动修改地址指针。可以处理的数据串长度最多为64K字节。,基本串操作指令有五条:传送(MOVS),比较(CMPS),搜索(SCAS),取(LODS),存(STOS)。串操作重复前缀加在基本串操作指令之前,根据不同条件判断是否重复执行串操作。可以实现对整个串的同一种操作,使得处理长数据串比用软件循环处理快。,(6)重复的数据串处理过程可被中断。,(2)所有的串操作指令都用DS:SI默认的源串指针,可段超越;ES:DI固定的目标串指针,不允许段超越。,(3)用CX存待处理的串元素个数。每处理一个串元素,自动使CX1。,基本串操作的主要特点:,(1)可分别对字节和字进行操作(串元素)。,(5)加有重复前缀时,固定使用CX计数并修改重复次数,再根据CX值及标志位ZF判断是否重复进行串操作。前缀本身不影响任何标志位。,(4)自动修改串指针:方向标志DF决定指针的修改方向DF=0,指针加;DF=1,指针减。串元素的类型决定修改量字节串,指针加/减1;字串,指针加/减2。,在执行MOVS指令时,应该先做好以下准备工作:DS段中源串首地址(或反向传送末地址)存入SI寄存器中。ES段中目的串首地址(或反向传送末地址)存入DI寄存器中。数据串长度存入CX。建立方向标志DF。,*MOV单指令不能完成存储单元之间的数据传送;MOVS指令就是为解决存储单元之间数据传送而设置的。,例:将内存的数据段中以AREA1为首地址的100个数据,传送到附加段中的AREA2为首地址的区域。(用MOV及MOVS分别完成,并加以比较),用MOVS串操作指令编程:MOVAX,SEGAREA1MOVDS,AXMOVAX,SEGAREA2MOVES,AXMOVSI,OFFSETAREA1MOVDI,OFFSETAREA2MOVCX,100CLD;DF=0,增址传送LOOP1:MOVSAREA2,AREA1DECCXJNZLOOP1,用MOV指令编程:MOVAX,SEGAREA1MOVDS,AXMOVAX,SEGAREA2MOVES,AXMOVSI,OFFSETAREA1;将ARE1偏移地址SIMOVDI,OFFSETAREA2MOVCX,100LOOP1:MOVAL,SI;(AL)(DS):(SI)MOVES:DI,AL;(ES):(DI)(AL)INCSIINCDIDECCXJNZLOOP1,串取指令有3种格式:LODSsrc(字节)(AL)(DS):(SI),(SI)(SI)1(字)(AX)(DS):(SI),(SI)(SI)2LODSB(字节)(AL)(DS):(SI),(SI)(SI)1LODSW(字)(AX)(DS):(SI),(SI)(SI)2,功能:将由SI指定的数据段中某单元内容AL或AX中,DF=0:SISI+1或+2;DF=1:SISI1或-2。,LODS应用注意:指令允许用段超越前缀来指定非数据段的存储区。该指令不影响标志位。一般说来,每用一次,累加器的内容就改变一次。若重复使用,AL中只能保持最后一个元素。有时缓冲区中的一串字符需要多次取出测试时可用本指令。,实际上是目标串固定为累加器的串传送指令,(2)STOS:存入串指令,功能:将AL或AX(ES):(DI),DI1(2)DI。用途:与REP联用,CX缓冲区长度。用来建立一串相同值。,存入串指令有3种格式:STOSdest;(字节)(ES):(DI)(AL),(DI)(DI)1(字)(ES):(DI)(AX),(DI)(DI)2STOSB(字节);(ES):(DI)(AL),(DI)(DI)1STOSW(字);(ES):(DI)(AX),(DI)(DI)2,例:内存中有一个首地址为BLOCK,补码表示的有符号数的数据块。要求将正、负数分开,分别存于两个缓冲区:存放正数的缓冲区首址为PLUS_DATA;存放负数的缓冲区首址为MINUS_DATA。,设:源数据块用SI寻址。正数的目标区用DI寻址,负数的目标区用BX寻址。循环次数CX。,实际上是源串固定为累加器的串传送指令,传送过程:用LODS指令把源数据取入AL中;检查其符号确定正负:若为正用STOS指令送至正数缓冲区;若是负数,把DI与BX交换,仍使用STOS传送。传送完后再将DI与BX交换,恢复原值。,程序见下页,3.串比较指令CMPSOPRD1,OPRD2,功能:将DS:SI指定的源串中的元素与ES:DI指定的目标串中的相应元素相减,但两个存储单元中的内容不变,而是用标志位的变化表示比较结果。同时根据方向标志DF自动修改源和目标串指针SI、DI。OPRD1、OPRD2分别为源串和目标串的符号地址。,串比较指令有3种格式:CMPSsrc,dest;(DS):(SI)(ES):(DI),结果不存。CMPSB(字节);(SI)(SI)1,(DI)(DI)1CMPSW(字);(SI)(SI)2,(DI)(DI)2,START:MOVSI,OFFSETBLOCKMOVDI,OFFSETPLUS_DATA;正数缓冲区MOVBX,OFFSETMINUS_DATA;负数缓冲区MOVCX,COUNTCLDGOON:LODSBTESTAL,80HJNZMINS;若负数转MINSSTOSB;正数,DIAL,DIDI+1JMPAGAINMINS:XCHGBX,DISTOSB;负数,DIAL,DIDI+1XCHGBX,DIAGAIN:DECCXJNZGOONHLT,4.串扫描指令(搜索指令)SCASOPRD,功能:将累加器(AL或AX)中的内容(关键字)与ES:DI指定的目标串元素(字节或字)进行比较(减法操作),用标志位反映比较的结果,而不改变累加器和目标串的内容,达到字符串搜索的目的。同时自动修改指针DI。OPRD是目标串的符号地址。,串扫描指令有3种格式:SCASdest;SCASB(字节);(AL)(ES):(DI),DIDI1SCASW(字);(AX)(ES):(DI),DIDI2串扫描指令常用来从一个字符串中找一个指定字符。,实际上是源串固定为累加器的串比较指令,二、重复前缀REP/REPE/REPZ/REPNE/REPNZ控制后面紧随的串操作指令是否重复,分两种情况来讨论:(1)与REP相配合工作的MOVS、STOS、LODS指令REP重复串操作直到CX=0为止,(2)与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令REPE/REPZ当相等/为零时重复串操作REPNE/REPNZ当不相等/不为零时重复串操作,1.与REP相配合工作的MOVS、STOS、LODS指令格式:REPMOVS/STOS/LODS,执行过程:(1)若CX=0,则结束REP,执行REP的下一条指令;(2)若CX0,CXCX1;(3)执行REP后的串操作指令;(4)重复(1)(3);,例:在附加段STORE开始存5个空格MOVAL,20H;AL_MOVCX,5MOVDI,OFFSETSTORECLDREPSTOSB;(ES):(DI)AL,DIDI+1,对REPE/REPZCMPS/SCAS(1)若CX=0(串结束)或ZF0(某次比较结果两个操作数不等),则结束REPZ,执行REPZ的下一条指令;否则:(2)CXCX1;(3)执行REPZ后面的串操作指令;(4)重复(1)(3)。,当串未结束且串相等,则继续比较。,例利用CMPS指令对STRING1和STRING2两个字符串进行比较。相同:RESULT00H,不同:RESULT1。,LEASI,STRING1LEADI,STRING2MOVCX,COUNTCLDREPZCMPSB;CX0且两个操作数相等,重复。JNZUNMAT;若串不等,在RESUL0FFHMOVAL,0;若串相等,在RESULT00HJMPOUTPTUNMAT:MOVAL,0FFHOUTPT:MOVRESULT,ALHLT,注意:CX1操作不影响标志ZF标志由串操作决定当CX=0或ZF=0时退出循环,对REPNE/REPNZCMPS/SCAS(1)若CX=0(串结束)或ZF1(某次比较结果两个操作数相等),则结束REPNZ,执行REPNZ的下一条指令;否则:(2)CXCX1;(3)执行REPNZ后面的串操作指令;(4)重复(1)(3)。,当串未结束且串不相等,则继续比较。,例:要搜索的关键字放在(AL)或(AX)中,搜索某一数据块或字符串中有无关键字。若有,把搜索次数记下来,且记录关键字地址;若搜索次数为0,表示没有要搜索的关键字。,注意:CX-1操作不影响标志ZF标志由串操作决定当CX=0或ZF=1时退出循环,程序:LEADI,BLOCK;设置数据块地址指针MOVCX,COUNT;设置数据块长度MOVAL,CHAR;关键字送入AL或AXCLDREPNESCASB;CX0且ZF=0,继续SCASBJZFOUNDMOVDI,0JMPDONEFOUND:DECDIMOVPOINTR,DI;POINTR关键字地址LEABX,BLOCKSUBDI,BXINCDI;把搜索次数记下来,DONE:HLT,例:一个数据块由大小写英文字母、数字、其他符号组成,用CR(ASCII码0DH)结束。数据块首地址为BLOCK1,将其传送到BLOCK2为首地址的内存区,并将英文中小写英文字母(a-z)转换成大写英文字母(A-Z),其余不变。,LEASI,BLOCK1LEADI,BLOCK2CLDNEXT:LODSBCMPAL,0DHJZDONECMPAL,61HJCOKCMPAL,7BHJNCOKSUBAL,20HOK:STOSBJMPNEXTDONE:HLT,小结:串操作指令重复前缀,操作数,地址指针,控制程序流向:改变正常执行顺序,转向新目标,2.2.5控制转移类指令,在8086/8088程序中,指令的地址固定由CS和IP决定:CS和IP两寄存器的内容决定了程序的流程。改变CS和IP寄存器的值,就改变了程序执行的流程。(不能由用户修改,只能由CPU修改。),用于控制程序的执行流程。,8086/8088中CS和IP的变化规则:reset复位后,CS=FFFFH,IP=0故CPU从内存FFFF:0000H处取第一条指令执行,第一条指令在内存的ROM区。非控制转移指令CPU取来一条指令后,自动将IP的值加上该指令的字节数,使IP顺序指向下一条指令,CPU取来紧接着的指令执行。(此时IP的变化由CPU内部的硬件自动完成),控制转移指令-以CS和IP为主要操作对象改变CS和IP寄存器的值,就改变了程序执行的流程。使程序产生分支、调用结构。,包括:无条件转移指令、调用/返回指令、条件转移指令、循环控制指令和中断指令。特点:这些指令有的修改IP,有的修改CS和IP。,例:比较AX、BX的大小,将大数存于max单元。CMPAX,BXJGEgreatXCHGAX,BXgreat:MOVmax,AX,控制转移指令-以CS和IP为主要操作对象无条件转移指令JMP过程调用及返回指令CALL、RET条件转移指令:JC/JB/JNAE、JNC/JNB/JAE、JS、JNS、JZ/JE、JNZ/JNE、JO、JNO、JP/JPE、JNP/JPO、JA/JNBE、JAE/JNB、JB/JNAE、JBE/JNA、JG/JNLE、JGE/JNL、JL/JNGE、JLE/JNG循环控制指令LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE、JCXZ中断及中断返回指令INT、INTO、IRET,控制转移指令特点,所有控制转移指令都只有一个操作数,通过该操作数给出目标地址新的IP(或CS:IP)值。该类指令对IP(或CS:IP)进行强制性修改,并执行其他相关操作。不影响任何标志位的值。跳变或转移的目标地址距离当前的正常指针的地址偏移量称为“相对偏移量”:相对偏移量=目标地址-当前正常顺序的IP值相对偏移量是一个符号数,正值表示向后跳转,负值表示向前跳转。,控制转移指令特点,直接转移:转移的目标地址直接出现在指令中。间接转移:转移的目标地址间接的存储在某个Reg或内存变量中。,控制转移指令特点,控制转移指令可实现三种范围的跳转:近转移(near):段内转移,相对偏移量为1个字,取值范围-32768+32767;短转移(short):段内转移,相对偏移量为1个字节,取值范围-128+127;远转移(far):段间转移,目标地址与正常顺序的IP值不在同一个代码段内。近转移、短转移采用特殊的“相对寻址方式”来获得转移的目标地址。,相对寻址方式,仅用于进行段内直接转移的控制转移指令。指令操作数是8位或16位带符号相对偏移量,代表目标地址与当前正常顺序的地址之差:目标地址当前正常顺序的IP值相对偏移量编程时一般使用目标地址的标号作为操作数,不需要计算相对偏移量。例:JNZDIFFRT,1段内直接短转移JMPSHORTlable执行操作:IPIP+8位偏移量目标地址与JMP指令的下一条指令地址之差在-128+127之间。短转移属相对转移。,2段内直接近转移JMPNEARPTRlable执行操作:IPIP+16位位移量过程:如同SHORT,只是位移量为D16范围-32768+32767H,占有两个字节。目标地址与JMP指令下一条指令的地址之差在32K之间。近转移属相对转移。,指令格式:JMPOPRD功能:按照不同的操作数给出方式,找出目标地址,用它代替原指令指针。可实现全部存储空间内的转移。,一、无条件转移指JMP(无条件转移到指令指定的地址中去执行),例:代码段内有一条无条件转移指令,在汇编语言中使用符号地址。JMPSHORTNEXT符号地址(IP)(IP)当前+D8,显然,转移方向有两种:正向:负向:JMPX1X1::X1:JMPX1,例:JMPX1(X1是NEAR或SHORT型标号)当使用符号地址时,前面最好加上SHORT或NEARPTR。,3.段内间接转移JMPreg或JMPmem转移的目标地址在Reg(16位)或内存单元之中,属于绝对转移。执行操作:IPReg或IPEA,指令格式举例:JMPAXJMPSIJMPTABLEBX;操作数已定义为16位存储器操作数JMPALPHA_WORD;ALPHA_WORD是16位存储器操作数JMPWORDPTRBPDI,例:JMPBX;(设CS=3000H,IP=2400H,BX=3100H)执行此指令后,IP=3100H。,例:JMPWORDPTRBX;(设DS=2000H,BX1020H,21020H=34H,21021H=12H。)执行此指令后,IP=1234H。,4.段间直接转移JMPFARPTRlable(用符号地址时,最好用FARPTR)功能:无条件转移到段间的某一目标地址lable。这也是一种绝对转移指令。执行操作:IPlable的段内偏移地址CSlable所在段的段地址指令本身占有5个字节:用2个字分别存放符号地址的段值、偏移值,用1个字节存放操作码。,例2:目标地址也可直接用数值表达式给出,这时可省略FAR属性说明。JMPFARPTR2000H:0100H;程序将转向段地址为2000H,偏移地址为0100H的单元。,例1:C1SEGMENTJMPFARPTRnext_progC1ENDSC2SEGMINTnext_prog:C2ENDS,2000:0250H,5段间间接转移JMPmem执行操作:IPEACSEA+2EA由mem操作数的寻址方式决定。确定EA后,把指定存储单元的一个字的内容送IP,并把下一个字送CS。,例:MOVSI,0100HJMPDWORDPTRSI,执行这段程序后,把DS:SI即DS:0100H和DS:0101H两单元的字送IP,而把DS:0102H和DS:0103H两单元的字送CS。程序转入由新的CS和新的IP决定的目标地址。,二、调用与返回指令,子程序(过程)程序中具有独立功能的部分编写成独立程序模块。子程序定义格式:符号名PROC类型(NEAR或FAR)符号名ENDP,过程(Procedure)有两种类型:按过程与调用语句间的位置,过程有两种类型。NEAR类型:调用指令与过程在同一个段中FAR类型:调用指令与过程不在同一个段中,子程序调用指令:CALL子程序名(过程名);用在调用程序中RET;用在被调程序中,主程序的调用实质上是一种强制改变正常指令指针顺序的过程,调用之前的正常IP值称为“断点”。与JMP的不同之处:CALL有对应的返回指令;必须保存断点,执行过程与堆栈有关。,CALL,RET,CALL调用指令有4种:段内直接调用段间直接调用段内间接调用段间间接调用,1.CALL调用指令,子程序在当前代码段区域,则将子程序定义为NEAR(为段内调用)。*段内直接调用:目标地址就在CALL指令中*段内间接调用:目标地址在由指令指定的Reg或内存单元中。,段内直接调用CALL子程序名(与子程序的目标地址相关联)执行操作:SPSP-2(SP+1):(SP)IP;IPIP+D16将IP进堆栈保护,再修改IP,工作过程如下:(例:NEAR类型过程)codeSEGMENT;code段CALLsubp;YYY入栈,D16=subp-yyyXXX:YYYsubpPROCNEAR;过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 克拉玛依职业技术学院《数据库实训》2023-2024学年第二学期期末试卷
- 2025河南长期劳动合同范本
- 2025至2031年中国普通绿豆行业投资前景及策略咨询研究报告
- 2025至2031年中国收卡机行业投资前景及策略咨询研究报告
- 益阳医学高等专科学校《基础生态学》2023-2024学年第二学期期末试卷
- 2025至2031年中国打印机外壳行业投资前景及策略咨询研究报告
- 2025至2031年中国仓贮用低温除湿装置行业投资前景及策略咨询研究报告
- 致敬劳动筑梦成长主题队会教案
- 造型模板护岸施工方案
- 2025年合同法务人员合同管理实训题
- 【基础卷】同步分层练习:四年级下册语文第26课《宝葫芦的秘密》(含答案)
- 《新生儿复苏》课件
- 《教育系统重大事故隐患判定指南》知识培训 (一)
- 中小学班主任基本功素质大赛情景答辩题(附参考答案)
- DB3309T 104-2023 石油化工装置雷电防护检测业务规范
- 2024年06月工商银行黑龙江分行金融科技社会招聘(41人)笔试历年参考题库附带答案详解
- 公共基础知识课堂笔记
- 密室逃脱NPC协议
- 物业公司保安巡逻岗巡查记录表(完整版)
- 烟草制品零售数据统计分析考核试卷
- 《中国动画发展史》课件
评论
0/150
提交评论