




已阅读5页,还剩142页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章,顺序结构程序,教学重点,从本章开始,从程序结构角度展开学习8086常用指令的功能及应用。本章重点掌握:80 x86传送、算术运算、逻辑操作、移位操作等指令程序设计的步骤程序的基本控制结构,主要内容,5.1程序设计的步骤5.2流程图的应用5.3程序的基本控制结构5.4数据传送指令5.5算术运算指令5.6逻辑操作指令5.7移位操作指令5.8状态标志位操作指令5.9简单的I/O功能调用5.10顺序结构程序举例,5.1程序设计的步骤,1.分析问题2.建立数学模型3.设计算法4.编制程序5.上机调试,5.2流程图的应用,(1)流程线(2)端点框(3)判断框(4)处理框(5)连接框,条件,Y,N,开始,结束,顺序结构,初始化部分,工作部分,修改部分,开始,结束,分支与循环结构,结束,设置数据段地址,设置数据指针,AL第一个数据,(指针)=0FFH?,保存结果,Y,N,1,1,AL(指针)?,AL(指针),指针增量,N,Y,开始,5.3程序的基本控制结构,(1)顺序结构,(2)分支(选择)结构,(3)循环(迭代)结构,5.3.1顺序程序设计,顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构。,ssegsegmentstack;定义堆栈段dw512dup(?);堆栈段有512字(1024字节)空间ssegends;堆栈段结束dsegsegment;定义数据段stringdbHello,Everybody!,0dh,0ah,$dsegendscodesegment;code;定义代码段assumecs:code,ds:dseg,ss:ssegstart:movax,dseg;建立DS段地址movds,axmovdx,offsetstringmovah,9int21hmovax,4c00hint21h;利用功能调用返回DOScodeends;代码段结束endstart;汇编结束,同时指明程序起始点,汇编语言指令格式(复习),由4部分组成:标号:指令助记符目的操作数,源操作数;注释,标号表示该指令在主存中的逻辑地址,每个指令助记符就代表一种指令,目的和源操作数表示参与操作的对象,注释是对该指令或程序段功能的说明,指令操作数的表达(补充),r8任意一个8位通用寄存器。AHALBHBLCHCLDHDLr16任意一个16位通用寄存器。AXBXCXDXSIDIBPSPreg代表r8或r16。seg段寄存器。CSDSESSS,一定要熟悉噢!,指令操作数的表达(补充),m8一个8位存储器操作数单元(所有主存寻址方式)。m16一个16位存储器操作数单元(所有主存寻址方式)。mem代表m8或m16。,一定要熟悉噢!,指令操作数的表达(补充),i8一个8位立即数i16一个16位立即数imm代表i8或i16dest目的操作数src源操作数,一定要熟悉噢!,数据传送是计算机中最基本、最重要的一种操作传送指令也是最常使用的一类指令传送指令把数据从一个位置传送到另一个位置除标志寄存器传送指令外,均不影响标志位数据传送指令共有12条:重点掌握MOVXCHGXLATPUSHPOPLEA,5.4数据传送指令,MOVPUSHPOPXCHGXLATLEALDSLESLAHFSAHFPUSHFPOPF,MOV(move)传送,指令汇编格式:MOVdest,src操作:将一个源操作数(字节或字)传送到目标操作数中。dest(src)受影响的状态标志位:没有说明:指令中dest和src不能同时为存储器操作数;CS不能做为目标操作数使用,段寄存器之间不能互相传送,立即数不能送入段寄存器。,传送指令MOV(move),把一个字节或字的操作数从源地址传送至目的地址,MOVreg/mem,imm;立即数送寄存器或主存,MOV,例题5.1,MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存,例题5.2,MOVreg/seg,mem;主存送(段)寄存器,例题5.3,MOVreg/mem,seg;段寄存器送寄存器或主存,例题5.5,例5.1:立即数传送,moval,4;al4,字节传送movcx,0ffh;cx00ffh,字传送movsi,200h;si0200h,字传送movbyteptrsi,0ah;byteptr说明是字节操作movwordptrsi+2,0bh;wordptr说明是字操作,注意立即数是字节量还是字量明确指令是字节操作还是字操作,MOV,例5.2:寄存器传送,movax,bx;axbx,字传送movah,al;ahal,字节传送movds,ax;dsax,字传送movsi,al;sial,字节传送,MOV,例5.3:存储器传送,moval,bxmovdx,bp;dxss:bpmoves,si;esds:si,不存在存储器向存储器的传送指令,MOV,例5.5:段寄存器传送,movsi,dsmovax,es;axesmovds,ax;dsaxes,对段寄存器的操作有一些限制,MOV,MOV指令传送功能限制,MOV也并非任意传送,立即数,段寄存器CSDSESSS,通用寄存器AXBXCXDXBPSPSIDI,存储器,非法传送种种,两个操作数的类型不一致例如源操作数是字节,而目的操作数是字;或相反两个操作数不能都是存储器传送指令很灵活,但主存之间的直接传送却不允许段寄存器的操作有一些限制段寄存器属专用寄存器,对他们的操作能力有限,示例,示例,示例,两个操作数的类型要一致,绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令MOVAL,050AH;非法指令:050Ah为字,而AL为字节寄存器,本身有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型对于存储器单元与i8立即数同时作为操作数的情况,必须显式指明;byteptr指示字节类型,wordptr指示字类型movsi,0ahmovwordptrsi,0ahmovsi,0a000h,两个操作数不能都是存储器,8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种传送,可通过寄存器间接实现movax,buffer1;axbuffer1(将buffer1内容送ax)movbuffer2,ax;buffer2ax;这里buffer1和buffer2是两个字变量;实际表示直接寻址方式,要小心段寄存器的操作,不允许立即数传送给段寄存器MOVDS,100H;非法指令:立即数不能传送段寄存器不允许直接改变CS值MOVCS,SI;不允许使用的指令不允许段寄存器之间的直接数据传送MOVDS,ES;非法指令:不允许段寄存器间传送,MOV(move)传送指令(思考),判断下列各条语句的对错:DATADB10HMOVSI,DATAMOVAX,CSMOVDS,1000HMOVBX,BXMOVAX,DLMOVDS,CSMOVSI,10H,堆栈操作指令,堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定栈顶是地址较小的一端(低端),栈底不变,堆栈和队列,堆栈:按照后进先出(LIFO)的原则组织的存储器空间(栈)队列:按照先进先出(FIFO)的原则组织的存储器空间,堆栈的操作,堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP,PUSH;进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部,POP;出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2,说明:SS内容为段基址,偏移量由堆栈指针SP指出。PUSH指令的目标地址一定在当前堆栈中,操作数一定是16位的寄存器或存储器操作数。POP指令目标操作数也只能是16位的存储器或寄存器操作数(CS除外)。,进栈指令PUSH,pushaxpush2000h,PUSHr16/m16/seg;SPSP2;SS:SPr16/m16/seg,PUSH,PUSH指令(举例),假定AX=1234H,BX=5678H,SS=2000H,SP=0100H,则执行下列指令后堆栈的状态是:,PUSHAXPUSHBX,PUSHAXPUSHBX,假定AX=1234H,BX=5678H,SS=2000H,SP=0100H,则执行下列指令后堆栈的状态是,PUSH指令(举例),出栈指令POP,popaxpop2000h,POPr16/m16/seg;r16/m16/segSS:SP;SPSP2,POP,POP指令(举例),思考:假定在执行指令:POPCXPOPDX之前,堆栈的状态如图所示。指令执行后CX,DX的内容及堆栈的状态?,CX=5678H,DX=1234H,POP指令(举例),思考:假定SI=1234H,DI=5678H,则右侧指令执行后,DS,ES的内容是?,PUSHSIPUSHDIPOPDSPOPES,DS=5678H,ES=1234,堆栈的特点,堆栈操作的单位是字,进栈和出栈只对字量字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据堆栈常用来临时存放数据传递参数保存和恢复寄存器实现段更换,保存和恢复寄存器,实现段更换,例:现场保护恢复,pushax;进入子程序后pushbxpushds.popds;返回主程序前popbxpopax,思考:如何实现段更换,如何利用堆栈将DS段更换到CS段?,SP,段更换:PUSHDS,SP,DS原值,段更换:PUSHDSPUSHCS,SP,DS原值,CS原值,SP,DS原值,CS原值,段更换:PUSHDSPUSHCSPOPDS,DS的内容与CS的相同,交换指令XCHG(eXCHanGe),指令汇编格式:XCHGdest,src操作:dest的内容与src的内容互换。(dest)(src)受影响的状态标志位:没有说明:dest和src不能同时为存储器操作数。段寄存器、立即数不能作为操作数。,交换指令XCHG(exchange),把两个地方的数据进行互换,寄存器与寄存器之间对换数据寄存器与存储器之间对换数据不能在存储器与存储器之间对换数据,XCHG,XCHGreg,reg/mem;regreg/mem,例题5.7,例题5.6,例5.6:寄存器间交换,movax,1234h;ax=1234hmovbx,5678h;bx=5678hxchgax,bx;ax=5678h,bx=1234hxchgah,al;ax=7856h,XCHG,例5.7:寄存器与存储器交换,xchgax,2000h;字交换;等同于xchg2000h,axxchgal,2000h;字节交换;等同于xchg2000h,al,XCHG,XCHG指令(举例与思考),XCHGAL,BLXCHGAL,10XCHGCL,BXXCHGBL,BX+SI+10XCHGAL,SIXCHGSI,BX+10XCHGAX,AXXCHGDX,DS,判断下列各条语句的对错:,换码指令XLAT(translate),指令汇编格式:XLAT操作:BX和AL内容之和指出的内存字节单元的内容送到AL中。AL(BX+AL)受影响的状态标志位:没有说明:XLAT指令用于查表。表的开始地址即表头地址由BX寄存器给出。AL中的原始值是要寻址的表中元素地址的位移量,规定表中第一个字节的位移量为0。这是一种特殊的基址变址寻址方式,基址寄存器为BX,变址寄存器为AL。,换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码表格首地址存放于BX,AL存放相对表格首地址的位移量换码指令执行后:将AL寄存器的内容转换为目标代码,换码指令XLAT(translate),将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL,XLAT,XLAT;alds:bx+al,例题5.8,例5.8:代码转换,movbx,100hmoval,03hxlat,换码指令没有显式的操作数,但使用了BX和AL;因为换码指令使用了隐含寻址方式采用默认操作数,XLAT,思考题:如何用XLAT实现加密,看如下的一种加密方式(替代加密):ABCDEFGHIJKLMNOPQYZDMRNHXJLIOQUWACRSTUVWXYZBEGFKPTSV明文:THISISACOMPUTER密文:GXJEJEYDWQAFGRB,XLAT应用举例(实现加密),JMTABDBYZDMRNHXJLIOQDBUWACBEGFKPTSVMOVAX,SEGJMTABMOVDS,AXMOVBX,OFFSETJMTABMOVAL,TSUBAL,AMOVAH,0ADDBX,AXMOVAL,BX,XLAT,地址传送指令,地址传送指令将存储器单元的逻辑地址送至指定的寄存器有效地址传送指令LEA指针传送指令LDS和LES注意不是获取存储器单元的内容,取有效地址LEA(loadEA),指令汇编格式:LEAdest,src操作:将指令中给出的存储器操作数的有效地址(即地址的偏移量)送到指定的寄存器中。destEA受影响的状态标志位:没有说明:LEA指令是将源操作数地址的偏移量,即有效地址传送到目标操作数中。源操作数必须是一个存储器操作数,目标操作数可以是任一16位通用寄存器、指针寄存器或变址寄存器。,LEA,有效地址传送指令LEA(loadEA),将存储器操作数的有效地址传送至指定的16位寄存器中,例题,LEAr16,mem;r16mem的有效地址EA,LEA,例:获取有效地址,movbx,0400hmovsi,3chleabx,bx+si+0f62h;BX0400h003ch0f62h139EH,获得主存单元的有效地址;不是物理地址,也不是该单元的内容可以实现计算功能,LEA,LEA指令举例,DATA1DB10HLEABX,DATA1MOVBX,OFFSETDATA1MOVBX,1000HMOVDI,2000HLEAAX,BX+1243HLEADX,BXDI+1234H,AX=2243H,DX=4234H,指针传送指令,LDSr16,mem;r16mem,;DSmem+2LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器,LESr16,mem;r16mem,;ESmem+2LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器,例题,加载数据段寄存器,说明:将mem指出的连续两个字的内容,即一个32位的指针变量传送到一对16位的目标寄存器中。高位字为段基地址,低位字为偏移量,传送到由r16指出的一个通用寄存器、指针寄存器或变址寄存器中,但不能是段寄存器。,加载附加段寄存器,例:地址指针传送,movwordptr3060h,0100hmovwordptr3062h,1450hlesdi,3060h;es=1450h,di=0100h,mem指定主存的连续4个字节作为逻辑地址(32位的地址指针),送入DS:r16或ES:r16,00H01H00H10H,0010H,内存单元内容如右图,执行如下指令后,请说明BX和DS的值:MOVSI,10HLDSBX,SI,BX=?DS=?,LDS应用思考,BX=0100HDS=1000H,标志寄存器传送指令,标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作有2对4条指令低8位传送:LAHF和SAHF16位传送:PUSHF和POPF,标志低字节进出AH指令,LAHF;AHFLAGS的低字节LAHF指令将标志寄存器的低字节送寄存器AHSF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意,SAHF;FLAGS的低字节AHSAHF将AH寄存器内容送FLAGS的低字节用AH的第7/6/4/2/0位相应设置SF/ZF/AF/PF/CF标志,AHSF:ZF:AF:PF:CF说明:此2指令在80 x86中几乎无用,主要是为了保证与8080/8085向下兼容,才保留了该指令.,标志寄存器进出堆栈指令,PUSHF;SPSP2;SS:SPFLAGSPUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2,POPF;FLAGSSS:SP;SPSP2POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2,例题,例:置位单步标志,pushf;保存全部标志到堆栈popax;从堆栈中取出全部标志orax,0100h;设置D8=TF=1,;ax其他位不变pushax;将ax压入堆栈popf;FLAGSAX;将堆栈内容取到标志寄存器,5.5算术运算指令,5.5.1加法运算指令5.5.2减法运算指令5.5.3乘法运算指令5.5.4除法运算指令,四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算请注意算术运算类指令对标志的影响掌握:ADD/ADC/INC、SUB/SBB/DEC/NEG/CMP熟悉:MUL/IMUL、DIV/IDIV,5.5.1加法运算指令,1.ADD(addition)加法2.ADC(additionwithcarry)带进位加3.INC(incrementby1)增1,1.ADD(addition)加法,指令汇编格式:ADDdest,src操作:两个操作数求和,结果存目标操作数中。dest(dest)+(src)受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:dest和src不能同时为存储器操作数和段寄存器。,ADDreg,imm/reg/mem;regregimm/reg/memADDmem,imm/reg;memmemimm/reg,ADD,1.ADD(addition)加法,MOVAL,67HMOVBL,34HADDAL,BL,AL=9BHOF:1,SF:1,ZF:0,AF:0,PF:0,CF:0,例:ADDAL,3ADDCX,MEM_WADDGAMABPDI,BLADDBP+DI+OFFSETGAMA,BL,ADD,2.ADC带进位加法,指令汇编格式:ADCdest,src操作:两个操作数相加的同时,再加上CF。结果存入目标操作数中。dest(dest)+(src)+CF受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:ADC指令主要与ADD配合,实现多精度加法运算。例:ADCAL,3ADCDX,BX+10,ADC,2.ADC指令应用思考,如何实现:3字节数据相加:123456H+789ABCH=8ACF12H,MOVAL,56HMOVAH,34HMOVBL,12HADDAL,0BCHADCAH,9AHADCBL,78H,ADC,3.增量指令INC(increment),指令汇编格式:INCdest(reg/mem)操作:将指定的操作数加1,并将结果回送到目标操作数中。dest(dest)+1受影响的状态标志位:OF,SF,ZF,AF,PF说明:INC指令不影响CF。要明确操作数的类型。,INC,指令INC应用的示例与思考,判断对错,为什么错?如何改正?,INCALINCDATA1INCBXINCBX,X,5.5.2减法运算指令,1.SUB(subtract)减法2.SBB(subtractwithborrow)带借位减3.DEC(decrementby1)减14.NEG(negate)取补5.CMP(compare)比较,1.SUB(subtract)减法,指令汇编格式:SUBdest,src操作:从目标操作数减去源操作数,结果存入目标操作数中。dest(dest)-(src)受影响的状态标志位:OF,SF,ZF,AF,PF,CF,SUB,SUBreg,imm/reg/mem;regregimm/reg/memSUBmem,imm/reg;memmemimm/reg,1.SUB(subtract)减法,MOVAL,97HMOVBL,34HSUBAL,BL,AL=63HOF:1,SF:0,ZF:0,AF:0,PF:1,CF:0,SUB,例:SUBAL,10HSUBAL,BX+10HSUBAL,AL,2.SBB带借位减法,指令汇编格式:SBBdest,src操作:从目标操作数中减去源操作数和CF,结果存入目标操作数中。dest(dest)-(src)-CF受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:SBB指令主要用于多精度数据减法。例:SBBAL,0SBBDL,CL,SBB,2.SBB指令应用思考,如何实现:3字节数据相减:923456H-789ABCH=19999AH,MOVAL,56HMOVAH,34HMOVBL,92HSUBAL,0BCHSBBAH,9AHSBBBL,78H,SBB,3.DEC(decrementbyone)减1,指令汇编格式:DECdest(reg/mem)操作:将指定的操作数减1,并将结果送回到目标操作数中。dest(dest)-1受影响的状态标志位:OF,SF,ZF,AF,PF说明:DEC指令不影响CF。例:DECBXDECBYTEPTRBX+SI+1000HDECSP,DEC,INC指令和DEC指令都是单操作数指令主要用于对计数器和地址指针的调整,4.NEG(negate)取补(取负),指令汇编格式:NEGdest(reg/mem)操作:用0减去指令中给定的操作数,最后将结果送回到给定的操作数中。求补运算也可以表达成:将操作数按位取反后加1。dest0-(dest)受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:NEG指令对于带符号的数来说是取负,即改变操作数的符号。如果操作数操作前内容非零,操作后CF=1,否则CF=0。例:NEGAXNEGBYTEPTRBX+10,NEG,例题,例:求补运算,movax,0ff64hnegal;ax=ff9ch,OF=0、SF=1、ZF=0、PF=1、CF=1subal,9dh;ax=ffffh,OF=0、SF=1、ZF=0、PF=1、CF=1negax;ax=0001h,OF=0、SF=0、ZF=0、PF=0、CF=1decal;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=1negax;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=0,NEG,5.CMP(compare)比较,指令汇编格式:CMPdest,src操作:将目的操作数减去源操作数,但结果不回送目的操作数,按照定义相应设置状态标志。(dest)-(src)受影响的状态标志位:OF,SF,ZF,AF,PF,CF说明:CMP将两个操作数相减,两个操作数保持原值不变,但与SUB指令一样影响标志。,CMPreg,imm/reg/mem;regimm/reg/memCMPmem,imm/reg;memimm/reg,CMP,例:CMPAL,BLCMPDL,10H,例题,例:比较AL与100,cmpal,100;al-100jbbelow;al100,跳转到below执行subal,100;al100,alal-100incah;ahah+1below:.,执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等,CMP,5.5.3乘法运算指令,乘法指令共有两条,分别对应无符号整数的乘法和带符号整数的乘法.,MULr8/m8;无符号字节乘法;AXALr8/m8MULr16/m16;无符号字乘法;DX.AXAXr16/m16,IMULr8/m8;有符号字节乘法;AXALr8/m8IMULr16/m16;有符号字乘法;DX.AXAXr16/m16,例题,举例,说明,乘法指令的功能说明,乘法指令分无符号和有符号乘法指令乘法指令的源操作数显式给出,隐含使用另一个操作数AX和DX字节量相乘:AL与r8/m8相乘,得到16位的结果,存入AX字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX乘法指令利用OF和CF判断乘积的高一半是否具有有效数值,乘法指令对标志的影响,乘法指令如下影响OF和CF标志:MUL指令若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1IMUL指令若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1乘法指令对其他状态标志没有定义,对标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1)对标志没有影响:指令执行不改变标志状态,例:MUL无符号乘法,AX,src,AX,DX,例:MULBLMULDXMULBYTEPTRSI+BX+1000H,MUL,例:乘法运算,moval,0b4h;al=b4h=180movbl,11h;bl=11h=17mulbl;ax=Obf4h=3060;OF=CF=1,AX高8位不为0moval,0b4h;al=b4h=76movbl,11h;bl=11h=17imulbl;ax=faf4h=1292;OF=CF=1,AX高8位含有效数字,例5.4计算Y=5X+8,设X为无符号字节数据,且在ARGX单元存放。计算结果,存入RLTY单元。,乘法运算实例,ssegsegmentstack;定义堆栈段dw512dup(?);堆栈段有512字(1024字节)空间ssegends;堆栈段结束DSEGSEGMENT;定义数据段ARGXDB15HRLTYDW0DSEGENDS;数据段结束CSEGSEGMENT;定义代码段ASSUMECS:CSEG,DS:DSEG,SS:SSEGCALCU:MOVAX,DSEG;程序入口CALCUMOVDS,AXMOVAL,5MULARGXADDAX,8MOVRLTY,AXMOVAX,4C00HINT21HCSEGENDS;代码段结束ENDCALCU;整个程序结束,5.5.4除法运算指令,DIVr8/m8;无符号字节除法:ALAXr8/m8的商,AhAXr8/m8的余数DIVr16/m16;无符号字除法:;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数,IDIVr8/m8;有符号字节除法:ALAXr8/m8的商,AhAXr8/m8的余数IDIVr16/m16;有符号字除法:;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数,例题,说明,除法指令的说明,除法指令分无符号和有符号除法指令除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX除法指令对标志没有定义除法指令会产生结果溢出,除法错中断,当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,80 x86CPU中就产生编号为0的内部中断(除法错中断),此时商和余数都不确定。对DIV指令,除数为0,或者在字节除时商超过8位(0FFH),或者在字除时商超过16位(0FFFFH),则发生除法溢出对IDIV指令,除数为0,或者在字节除时商不在-128127范围内,或者在字除时商不在-3276832767范围内,则发生除法溢出,除法指令的功能,例:除法运算,movax,0400h;ax=400h=1024movbl,0b4h;bl=b4h=180divbl;商al05h5;余数ah7ch124movax,0400h;ax=400h=1024movbl,0b4h;bl=b4h=76idivbl;商alf3h13;余数ah24h36,乘除法指令的应用扩充,乘法指令能实现:BYTEBYTE=WORDWORDWORD=DWORD除法指令能实现:WORD/BYTE=BYTEDWORD/WORD=WORD思考:如何实现:WORDBYTEBYTE/BYTEWORD/WORD,字节/字转换为字/双字(无符号数),无符号:字节转换为字(ALAX):MOVAH,0字转换为双字(AXDX:AX):MOVDX,0带符号:字节转换为字(ALAX)正数:MOVAH,0负数:MOVAH,0FFH字转换为双字(AXDX:AX)正数:MOVDX,0负数:MOVDX,0FFFFH,3.CBW(convertbytetoword)字节转换为字,符号扩展指令(字节/字字/双字),CBW;AL的符号扩展至AH;如AL的最高有效位是0,则AH00;AL的最高有效位为1,则AHFFH。AL不变,CWD;AX的符号扩展至DX;如AX的最高有效位是0,则DX00;AX的最高有效位为1,则DXFFFFH。AX不变,符号扩展指令常用于获得倍长的数据,例题,4.CWD(convertwordtodoubleword)字转换为双字,不影响标志位,符号扩展的概念,符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。符号扩展不改变数据大小对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100)对于数据ff00H(表示有符号数256),其最高位D15为1,符号扩展后高16位都是1,成为ffffff00H(仍表示有符号数256),例:符号扩展,moval,80h;al=80hcbw;ax=ff80haddal,255;al=7fhcbw;ax=007fh,例:实现AXBX,cwd;DX.AXAXidivbx;AXDX.AXBX,利用符号扩展指令得到除法指令所需要的倍长于除数的被除数对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数,DATA1DW45HDATA2DW3CH,无符号数:MOVAX,DATA1MULDATA2,带符号数:MOVAX,DATA1IMULDATA2,乘法应用举例,DATA1DB45HDATA2DW3CH,无符号数:MOVAL,DATA1MOVAH,0MULDATA2,带符号数:MOVAL,DATA1CBWIMULDATA2,乘法应用举例WORDBYTEWORDWORD,DATA1DW45HDATA2DB3CH,无符号数:MOVAX,DATA1DIVDATA2,带符号数:MOVAX,DATA1IDIVDATA2,除法应用举例,DATA1DB45HDATA2DB3CH,无符号数:MOVAL,DATA1MOVAH,0DIVDATA2,带符号数:MOVAL,DATA1CBWIDIVDATA2,除法应用举例BYTE/BYTEWORD/BYTE,DATA1DW45HDATA2DW3CH,无符号数:MOVAX,DATA1MOVDX,0DIVDATA2,带符号数:MOVAX,DATA1CWDIDIVDATA2,除法应用举例WORD/WORDDWORD/WORD,5.6逻辑操作指令,1.NOT(not,orform1scomplement)取反2.AND(and,logicalconjunction)逻辑与3.OR(or,inclusive)逻辑或4.XOR(exclusiveor)异或5.TEST(test,orlogicalcompare)测试,1.逻辑非指令NOT,对一个操作数执行逻辑非运算,NOT指令是一个单操作数指令NOT指令不影响标志位,NOTreg/mem;reg/memreg/mem,按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”,NOT,例:NOTAHNOTDXNOTWORDPTRBX+SI+1000H,2.逻辑与指令AND,对两个操作数执行逻辑与运算,结果送到目的操作数,AND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0。可以用来清除某些位。,AND,例:ANDAL,0FHANDAL,BXANDDX,DX,3.逻辑或指令OR,对两个操作数执行逻辑或运算,结果送到目的操作数,OR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,只要相“或”的两位有一位是1,结果就是1;否则,结果为0。可以用来设置某些位。,OR,例:ORAL,0FHORAL,BXORDX,DXORAL,AL,4.逻辑异或指令XOR,对两个操作数执行逻辑异或运算,结果送到目的操作数,XOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,只有相“异或”的两位不相同,结果才是1;否则,结果为0,XOR,例:XORAL,0FHXORAL,BXXORDX,DX,5.测试指令TEST,对两个操作数执行逻辑与运算,结果不回送到目的操作数,但设置状态标志位。,与AND指令相同设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义。,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,TEST,例:逻辑运算,moval,45h;逻辑与al=01handal,31h;CF=OF=0,SF=0、ZF=0、PF=0moval,45h;逻辑或al=75horal,31h;CF=OF=0,SF=0、ZF=0、PF=0moval,45h;逻辑异或al=74hxoral,31h;CF=OF=0,SF=0、ZF=0、PF=1moval,45h;逻辑非al=0bahnotal;标志不变,例:逻辑指令应用,;AND指令可用于复位某些位(同0相与),不影响其他位:将BL中D3和D0位清0,其他位不变andbl,11110110B;OR指令可用于置位某些位(同1相或),不影响其他位:将BL中D3和D0位置1,其他位不变orbl,00001001B;XOR指令可用于求反某些位(同1相异或),不影响其他位:将BL中D3和D0位求反,其他不变xorbl,00001001B,例:测试为0或1,testal,01h;测试AL的最低位D0jnzthere;标志ZF=0,即D0=1;则程序转移到there.;否则ZF=1,即D0=0,顺序执行there:.,TEST指令通常用于检测一些条件是否满足,但又不希望改变原操作数的情况,思考:TEST指令与CMP指令有何异同?何时用TEST指令?何时用CMP指令?,5.7移位操作指令,移位指令共有8条,描述了7种移位操作,可以对字节或字操作数移位。分别为:逻辑移位(SHL,SHR)算术移位(SAL,SAR)不带进位循环移位(ROL,ROR)带进位循环移位(RCL,RCR)。格式:移位指令助记符dest,cnt,逻辑移位和算术移位(shift),将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作,SHLreg/mem,1/CL;逻辑左移,最高位进入CF,最低位补0,SHRreg/mem,1/CL;逻辑右移,最低位进入CF,最高位补0,SALreg/mem,1/CL;算术左移,最高位进入CF,最低位补0,SARreg/mem,1/CL;算术右移,最低位进入CF,最高位不变,SAL与SHL相同,演示,图示,逻辑左移SHLAL,1,移位指令的功能,移位指令的操作数,移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元后一个操作数表示移位位数,该操作数为1,表示移动一位;当移位位数大于1时,则用CL寄存器值表示,该操作数表达为CL,移位指令对标志的影响,按照移入的位设置进位标志CF根据移位后的结果影响SF、ZF、PF对AF没有定义如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF=1;否则OF=0。当移位次数大于1时,OF不确定。,循环移位指令(rotate),将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作,ROLreg/mem,1/CL;不带进位循环左移,RORreg/mem,1/CL;不带进位循环右移,RCLreg/mem,1/CL;带进位循环左移,RCRreg/mem,1/CL;带进位循环右移,图示,图示,不带进位循环移位指令,带进位循环移位指令,循环移位指令对标志的影响,按照指令功能设置进位标志CF不影响SF、ZF、PF、AF如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF=1;否则OF=0。当移位次数大于1时,OF不确定。,移位操作指令总结,例:移位指令,movcl,4moval,0f0h;al=f0hshlal,1;al=e0h;CF=1,SF=1、ZF=0、PF=0,OF=0shral,1;al=70h;CF=0,SF=0、ZF=0、PF=0、OF=1saral,1;al=38h;CF=0,SF=0、ZF=0、PF=0、OF=0saral,cl;al=03h;CF=1,SF=0、ZF=0、PF=1,例:移位乘法,movsi,axshlsi,1;si2axaddsi,ax;si3axmovdx,bxmovcl,03hshldx,cl;dx8bxsubdx,bx;dx7bxadddx,si;dx7bx3ax,逻辑左移一位相当于无符号数乘以2逻辑右移一位相当于无符号数除以2,例:32位数移位,shlax,1rcldx,1,;将DX.AX中32位数值左移一位,例:位传送,;把AL最低位送BL最低位,保持AL不变rorbl,1roral,1rclbl,1rolal,1,AL之D0,逻辑和移位操作综合举例,将寄存器AL的第i位状态写入到BL的第i位上,BL的其它位状态不允许改变,已知i在CL中。,MOVAH,01HSHLAH,CLORBL,AHXORBL,AHANDAH,ALORBL,AH,思考题:将寄存器AL的第i,i+1位状态写入到BL的第i,i+1位上,BL的其它位状态不允许改变,已知i在CL中。,例5.2设内存DATA单元存放一个无符号字节数据,编制程序将其拆成两位十六进制数,并存入HEX和HEX+1单元中,HEX存放高位十六进制数,HEX+1单元存放低位十六进制数。,0B5H,0BH,05H,SHR,4,AND,0FH,1:;*EXAM5.2*2:SSEGSEGMENTSTACK3:STKDB20DUP(0)4:SSEGENDS5:DSEGSEGMENT6:DATADB0B5H7:HEXDB0,08:DSEGENDS9:CSEGSEGMENT10:ASSUMECS:CSEG,DS:DSEG11:ASSUMESS:SSEG12:DISC:MOVAX,DSEG13:MOVDS,AX14:MOVAX,SSEG15:MOVSS,AX16:MOVSP,LENGTHSTK,17:MOVAL,DATA;取数据18:MOVAH,AL;保存副本19:;ANDAL,0F0H;截取高4位20:MOVCL,0421:SHRAL,CL;移至低4位22:MOVHEX,AL23:ANDAH,0FH;截取低4位24:MOVHEX+1,AH25:MOVAX,4C00H26:INT21H27:CSEGENDS28:ENDDISC,例5.3设HEX,HEX+1单元的低4位分别存放一位十六进制数,编制程序将其装配在一个字节中并存入DATA单元。HEX单元中数据做为高位部分。,0BH,05H,B5H,SHL,4,B0H,OR,;*EXAM5.3*SSEGSEGMENTSTACKSTKDB20DUP(0)SSEGENDSDSEGSEGMENTHEXDB0AH,06HDATADB0DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DESGASSUMESS:SSEGPACK:MOVAX,DSEGMOVDS,AXMOVAX,SSEGMOVSS,AXMOVSP,SIZESTKMOVAL,HEXMOVCL,04SHLAL,CLORAL,HEX+1MOVDATA,AL,MOVAX,4C00HINT21HCSEGENDSENDPACK,5.8状态标志位操作指令,80 x86有7条状态标志位控制指令,它们可以直接和独立地对80 x86CPU中的某一状态标志位进行控制,用来设置或改变状态标志位的状态。标志清0置1取反CFCLCST
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿童自然拼读教学课件合集
- 湖州学院《高等数学A1》2024-2025学年第一学期期末试卷
- 宁夏大学新华学院《计算机组成及操作系统》2024-2025学年第一学期期末试卷
- 华北理工大学《历史学学术研究与论文写作》2024-2025学年第一学期期末试卷
- 张家口职业技术学院《环境和生态修复技术》2024-2025学年第一学期期末试卷
- 西昌学院《茶的制作与审评》2024-2025学年第一学期期末试卷
- 生产车间安全生产会议纪要模板
- 浙江工贸职业技术学院《最优化计算方法》2024-2025学年第一学期期末试卷
- 生活垃圾分类管理细则2024版
- 湖南汽车工程职业学院《散打中级》2024-2025学年第一学期期末试卷
- 矿山用电安全知识培训课件
- 《落实主体责任》课件
- 收到美因基因检测报告痛风
- 2016届年第二届天津市大学生化学竞赛理论知识个人赛试卷
- 通勤车租赁投标方案(技术标)
- 一人一档安全管理资料
- 东峰煤矿煤层资源储量估算分析
- 2022年临沧市市级单位遴选(选调)考试真题
- 评估量表模板
- 河北省医疗保险诊疗项目目录
- 三相异步电动机正反转说课课件
评论
0/150
提交评论