微机原理课件计算机ch_第1页
微机原理课件计算机ch_第2页
微机原理课件计算机ch_第3页
微机原理课件计算机ch_第4页
微机原理课件计算机ch_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机原理卢伟Email:luwei@Office:大黑楼B705TEL:84706161大连理工大学自动化系第三章8086微处理器的指令系统3.1指令系统概述3.2寻址方式3.38086指令系统3.3.1数据传送指令3.3.2算术运算指令3.3.3逻辑运算与移位指令3.3.4串操作指令3.3.5控制转移指令3.3.6处理器控制指令

3.1指令系统概述指令系统是一台计算机所能识别和执行的全部指令的集合。它与微处理器有着密切的关系,不同的微处理器有不同的指令系统。指令是使计算机执行某种特定操作的二进制编码。指令一般包括两个部分:操作码域和地址域。操作码域存放指令的操作码,即指明该指令应由计算机完成何种操作。地址域确定操作数的值或地址、操作结果的地址,有的指令的地址域还指出下一条指令的地址。机器指令:计算机能识别的代码,机器指令是由二进制数组成的。例如:ADDCL,BH机器指令为0000001011001111BPUSHAX机器指令为01010000汇编语言:汇编语言是一种符号语言,用助记符表示操作码,用符号或符号地址表示操作数或操作数地址,它与机器指令是一一对应的汇编程序:MASM.EXE将汇编语言源程序翻译成机器语言,即目标程序。3.1指令系统概述根据指令内容确定操作数地址的过程,称为寻址。根据寻址方式计算所得到的地址叫做有效地址EA,也就是段内偏移地址。有效地址还需要与相应的段基地址组合才是20位的物理地址PA,该工作由微处理器来完成。寻址方式在两种方式下被涉及:操作数的寻址方式和指令的寻址方式。如果没有特别说明,寻址方式是指源操作数的寻址方式。3.2寻址方式1、隐含寻址指令已经默认对微处理器中的某个寄存器进行操作,不用在指令中指明所使用的寄存器,即隐含了规定的操作数,这样的寻址方式称为隐含寻址。例:DAA指令,只有操作码,无操作数,但已经规定是对AL中的内容进行十进制调整。3.2寻址方式操作数寻址2、立即寻址操作数直接放在指令中。不需要访问存储器。操作数可以是8位的也可以是16位的,有时也称为立即数。立即数只能是源操作数。例3.1MOVAL,34HMOVAX,1234H需要注意在16位操作时,两个字节数据的高低位存储位置。3.2寻址方式3、寄存器寻址

操作数就放在微处理器的内部寄存器中,AX、BX、CX、DX、DI、SI、SP和BP,不需要访问存储器。例3.2:INCCXMOVAX,BX若执行前(AX)=30A6H,(BX)=69EDH,(CX)=40D9H则执行后,(AX)=69EDH,BX内容不变,(CX)=40DAH。以上三种寻址方式都是直接在微处理器内部获得数据,因此操作速度快。

3.2寻址方式4、存储器寻址

操作数放在存储器中,执行部件EU计算出存储器操作数的偏移量,即有效地址EA。这是一个无符号数,由总线接口部件BIU的地址加法器计算出物理地址,然后执行存取该操作数所需的总线周期。对于8086,有效地址EA有3种成分:(1)位移量(2)基址(3)变址EA=基址+变址+位移量3.2寻址方式(1)直接寻址有效地址由指令直接给出,有效地址只包含8位/16位的位移量。MOVAL,[1234H]默认的段寄存器是DS,也可以在指令中使用段超越前缀来指定段寄存器。例3.3:MOVAL,ES:[1234H]有效地址EA=1234H,在指令中直接给出。物理地址PA=(ES)×10HH

3.2寻址方式例3.4MOVAX,[2000H]若(DS)=3000H,则执行情况如图示。直接寻址也可用符号地址。例3.5:MOVAX,VALUE/MOVAX,[VALUE]这里,VALUE就是存放操作数单元的符号地址。3.2寻址方式存储器3032000H30000H代码段AH5032001HAL(AX)=3050H数据段例3.4的执行过程3.2寻址方式(2)寄存器间接寻址和寄存器相对间接寻址操作数的地址在对应的寄存器中称为寄存器间接寻址,若还有位移量(disp)则称为寄存器相对间接寻址。EA取自基址寄存器BX,BP或变址寄存器SI,DI中的一个,操作数在有效地址对应的存储单元中。即EA=(BX、BP、SI、DI之一)+dispBX用于间接寻址时,默认段寄存器为DS,允许段超越BP用于间接寻址时,默认段寄存器为SS,允许段超越SI用于间接寻址时,默认段寄存器为DS,允许段超越DI用于间接寻址时,只有在串操作指令中,默认段寄存器为ES,其余情况默认段寄存器均为DS,不允许段超越;

3.2寻址方式注:IP只能在代码段中(CS)寻址,SP只能在堆栈段(SS)中寻址。例3.7MOVAX,[BX]若(DS)=2000H,(BX)=1000H则EA=(BX)=1000H物理地址PA=20000HH=21000H,执行情况如下图示。(AX)=(21000H)=5030H3021000H20000HAH5021001HAL(AX)=5030H3.2寻址方式例3.8INCBYTEPTR[BX]EA=(BX)PA=(DS)×10H+(BX)若是寄存器相对间接寻址,则要加上位移量。例3.9INCBYTEPTR[BX+disp]EA=(BX)+dispPA=(DS)×10H+(BX)+disp例3.10MOVAX,COUNT[SI]/MOVAX,[SI]COUNT/MOVAX,[SI+COUNT]若COUNT=3000H,(DS)=3000H(SI)=2000H,则物理地址=35000H,指令执行如上图所示。指令执行后(AX)=1234H3435000H30000HAH1235001HAL(AX)=1234H32000H3.2寻址方式(3)基址寻址和基址相对寻址操作数的地址在基址寄存器BX,BP中称为基址寻址;若还有位移量,则称为基址相对寻址。位移量可以是8位或16位。例3.11MOVAX,[BX+disp]使用BX,默认段寄存器是DS,而BP则默认的段寄存器为SS。EA=(BX)或(BP)+dispPA=(DS)或(SS)×10H+disp3.2寻址方式例3.12MOVAX,COUNT[BX]若(DS)=3000H,(BX)=2000H,COUNT=3000H,(35000H)=1234H则EA=2000HH=5000HPA=30000HH=35000H执行该指令后,(AX)=1234H(4)变址寻址和变址相对寻址操作数的地址在变址寄存器SI、DI中称为变址寻址;若还有位移量,则称为变址相对寻址。EA=(SI)或(DI)+disp例3.13MOVAH,[SI+disp]3.2寻址方式(5)基址变址寻址和基址变址相对寻址EA=BX或BP中的基址地址+SI、DI中的变址地址+disp;实际上这种寻址为(3)、(4)两种寻址的组合。例3.14MOVAX,[BP+DI]此时隐含的段寄存器为SS,若用BX,则隐含的段寄存器为DS.EA=(BX或BP)+(SI或DI)+dispPA=(DS)×10H+(BX)+(SI或DI)+dispPA=(SS)×10H+(BP)+(SI或DI)+disp3.2寻址方式例3.10MOVAX,[BX][DI]若(DS)=2100H,(BX)=0158H,(DI)=0002H,(015AH)=1234H则EA=0158HH=015AHPA=EAH=2115AH指令执行后,(AX)=1234H例3.11:MOVAX,[MASK+BX+SI]若(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=0250H(33250H)=34H,(33251H)=12H则EA=2000HHH=3250HPA=30000HHHH=33250H指令执行如下图所示。执行该指令后(AX)=1234H3.2寻址方式低地址高地址CS段操作码50H02H34H12H34H12HAXDS段3000033250BX025033250+MOVAX,[BX+SI+MASK]DS300002000SI10003.2寻址方式8086采用I/O端口与存储器独立编址的方式。访问I/O端口需要专门指令IN和OUT,通过AX/AL来完成。(1)直接寻址在指令直接给出I/O端口地址,此地址应在0-255(0-FFH)之间例如:INAL,20H;从端口地址20H读入一个字节(2)间接寻址,寄存器只能用DX由DX给出I/O端口地址,此方式适用端口地址为0-65535(0-FFFFH)之间的任意值。例如:OUTDX,AL3.2寻址方式5、I/O端口寻址

寻址方式的书写格式1、在方括号内部允许有一个或两个寄存器的名字,如果一对方括号内部有基址寄存器和变址寄存器,使用“+”作为连接。2、在方括号内部允许有位移量,使用+或-号作为连接符号。3、在方括号外部允许有位移量,可以在左边或右边。MOV AX,[BX+SI+6]MOV AX,[BX+SI]6MOV AX,6[BX+SI]MOV AX,[BX][SI]6MOV AX,[BX+6][SI]3.2寻址方式8086数据存储器寻址方式小结:立即寻址,操作数直接放在指令中。隐含寻址,指令已经隐含了存放操作数的寄存器寄存器寻址(8个通用寄存器)直接寻址,有效地址由指令直接给出,即有效地址只包含位移量。寄存器间接寻址和寄存器相对间接寻址(BX、BP、SI、DI,位移量)基址寻址和基址相对寻址(BX、BP,位移量)变址寻址和变址相对寻址(SI、DI,位移量)基址变址寻址和基址变址相对寻址(BX、BP,SI、DI,位移量)其中1、2、3两种不用访问存储器。disp可以是8位/16位的有符号数。3.2寻址方式(1)段内直接寻址不改变CS,在IP上加一个位移量,则EA=(IP)+disp例如:JMPNEARPTRPROGIA;段内近转移JMPSHORTQUEST;段内短转移JMP25H;段内短转移,-128~+127JMP1025H;段内近转移,-32768~其中PROGIA和QUEST是转向的符号地址,在机器指令中,用位移量来表示。3.2寻址方式指令寻址例3.12:JMPBX;段内间接转移(IP)=(BX)JMPWORDPTR[BX+TABLE]若(BX)=1256H,(DS)=2000H,TABLE=20A0H,(232F6H)=3280H则执行JMPBX后,(IP)=EA=1256H执行JMPWORDPTR[BX+TABLE]后,EA=(BX)+disp=1256H+20A0H=32F6H(IP)=(PA)=(20000H+32F6H)=(232F6H)=3280H(2)段内间接寻址转向的有效地址是一个寄存器或一个存储单元的内容。这个寄存器或存储单元的内容可用除立即数寻址以外的任何一种寻址方式得到。转向的有效地址用来取代IP,这时CS值不变。3.2寻址方式例3.13:JMP3500H:080BH;段间直接转移(CS)=3500H,(IP)=080BH例3.14:JMPFARPTRNEXT_PROG其中NEXT_PROG是转向的符号地址;FARPTR为段间转移的操作符。执行该指令后,NEXT_PROG所在段的段地址送CS,NEXT_PROG在该段内的偏移量送IP。

(3)段间直接寻址指令中提供了转向的段地址和偏移地址,所以用段地址取代CS,用偏移地址取代IP。3.2寻址方式C1SEGMENT… JMPFARPTRNEXT_PROG…C1ENDSC2SEGMENT…NEXT_PROG:……C2ENDS执行JMPFARPTRNEXT_PROG后,C2段的段地址送CS,在C2段内NEXT_PROG的偏移量送IP。3.2寻址方式(4)段间间接寻址用存储器中两个相继字的内容来取代IP和CS,达到段间转移的目的。低地址中内容送IP,高地址中内容送CS。例3.15:JMPDWORDPTR[INTERS+BX]其中[INTERS+BX]说明寻址方式为基址相对寻址方式;DWORDPTR是双字操作符。例3.16:JMPDWORDPTR[BX+DI+ALPHA]这是基址变址相对寻址。EA=(BX)+(DI)+ALPHAPA=(DS)×10H+EA(IP)=(PA);低地址内容送IP(CS)=(PA+2);高地址内容送CS转移的物理地址是:PA=(CS)×10H+(IP)段间间接转移,目标地址存放在PA开始的4个连续单元中,其中低地址两个单元放IP内容,高地址两个单元放CS内容。3.2寻址方式寻址方式:1.立即寻址MOVAX,1234H2.寄存器寻址MOVAX,BX3.直接寻址 MOVAX,[1234H]4.寄存器间接寻址 MOVAX,[BX]5.基址寻址 MOVAX,[BX+100H]6.变址寻址 MOVAX,[SI+100H]7.基址加变址寻址 MOVAX,[BX+SI+100H]3.38086指令系统操作数分类立即数操作数:绿注1:立即数只能作为源操作数,不能作为目标操作数。注2:不能用一条指令简单地将立即数传送到段寄存器。寄存器操作数:红注3:有些指令没有指定使用的寄存器,但实际上隐含这特定的寄存器操作数。存储器操作数:蓝注4:不允许源操作数和目标操作数同时为存储器操作数。注5:存储器操作数的物理地址的计算是将段基地址左移四位加上有效地址EA(偏移地址)得到的。但是段寄存器和有效地址的配对是有规定的。注6:执行速度:寄存器操作数>立即数操作数>存储器操作数3.38086指令系统机器码:在8086系统中,任何一条指令都是以特定的若干个(1~6)字节的代码形式存在存储器的码段中。同样的指令(如MOV)由于寻址方式和操作数的不同,机器码的长度也不同。执行时间:指令的指令时间包括取址、译码和执行的时间,跟该指令的机器码的长短没有直接关系。

指令机器码字节数时钟数MOVAL,15HB0H15H24MOVAX,BX8BHC3H223.38086指令系统1数据传送指令(1)MOV指令MOVdest,src ;(dest)(src)1)源操作数可以是8/16位的立即数、寄存器操作数、内存操作数。目标操作数不允许为立即数,其余同源操作数。源、目的操作数不能同时为内存操作数。2)源、目的操作数类型必须匹配:MOVBYTEPTR[BX],12H3)不能向段寄存器写立即数:MOVAX,2000;MOVDS,AX4)以CS为目标的一切传送指令都是非法的。3.38086指令系统通用传送指令(2)堆栈操作指令PUSHsrc;(SP)(SP)-2;((SP)+1:(SP))(src)进栈指令,先调整堆栈指针,再把源操作数压栈。如:PUSHAXPOPdest ;(dest)((SP)+1:(SP));(SP)(SP)+2出栈指令,先将栈顶2字节送目标操作数,再调整堆栈指针。如:POPAX注1:堆栈指令指对字进行操作,不对字节进行操作,一般成对使用。注2:堆栈主要应用于子程序调用、中断的现场保护和恢复及参数传递等。3.38086指令系统低地址高地址12H34H34H12HAX堆栈段SSSP指向栈顶SP-1SP-1PUSHAX3.38086指令系统低地址高地址12H34H34H12HAX堆栈段SSSP指向栈顶SP+1SP+1POPAX3.38086指令系统(3)交换指令XCHGdest,src ;(dest)(src)交换指令,源、目不能同为内存操作数,只能在寄存器之间、寄存器和存储器之间交换,段寄存器不能作为一个操作数进行交换。如:XCHGAX,[SIH]3.38086指令系统(4)XLAT查表指令XLATsrc_table /XLAT ;(AL)((BX)+(AL))查表指令,用来取表中某指定数的值。执行指令前:序号AL表首址BX执行指令后:AL表中序号对应的字节内容例:TABLEDB48,49,50,51,52,53,54,55,56,57MOVBX,OFFSETTABLEMOVAL,5XLATTABLE执行后AL=533.38086指令系统完成累加器和I/O端口之间的数据传送(1)INacc,port;(acc)(port)端口号为8位时,直接寻址,最多可访问256个端口例:INAL,60H(将60H口地址的字节送给AL)INAX,60H(将60H口地址的字送给AX)端口地址为16位时,间接寻址,端口地址必须放在DX寄存器中,最多可访问65536个端口。例:MOVDX,3DAHINAL,DX;将3DAH口地址的字节送给AL(2)OUTport,acc;(port)(acc)例:MOVDX,3DAHOUTDX,AX输入输出指令3.38086指令系统LEAreg16,mem16有效地址传送指令,源操作数为内存操作数,将内存单元的有效地址(而不是内容)传送到目标寄存器。例:LEASI,AREA1MOVSI,OFFSETAREA1LDS/LESreg16,mem32指针传送指令,将传送一个32位目标指针(包含一个段地址和一个段内偏移量),从源操作数(内存操作数)传送至一对目的寄存器。其中段地址送至DS(ES),偏移量送至指定的16位寄存器中,通常是指针寄存器或者变址寄存器。例:LDSSI,[0100H]34H12HCDHABHDS:100H目标地址传送指令3.38086指令系统LAHF不影响标志位SAHF影响标志寄存器低8位PUSHFPOPF16位标志寄存器进栈/出栈指令数据传送指令中,除SAHF和POPF外,都不影响标志寄存器的内容。SZAPCODITAHFLAGLAHF/SAHF3.38086指令系统标志传送指令2算术运算指令8086指令系统算术运算指令一共20条加法ADD减法SUBADCSBBINCDECAAANEGDAACMP除法DIVAASIDIVDASAAD乘法MULCBWIMULCWDAAM3.38086指令系统运算数据格式和对标志位的影响数据类型类型字节字不带符号的二进制数0-2550~65535带符号的二进制数(补码)-128-127-32768~32767不带符号的压缩十进制数0-990~9999不带符号的非压缩十进制数0-90~993.38086指令系统运算数据格式和对标志位的影响对标志位的影响:所有算术运算指令都影响状态标志CF、PF、AF、ZF、SF和OF。①当无符号数运算结果溢出时,CF=1。②当有符号数运算产生溢出时,OF=1。③当运算结果中低8位有偶数个1或0个1,则PF=1。④若加法时第3位给第4位进位,或减法时第3位从第4位借位,则AF=1。⑤若运算结果为0,则ZF=1。⑥若运算结果为负数,则SF=1。3.38086指令系统ADDdest,src ;(dest)(dest)+(src)加法指令:ADDAL,27HADCdest,src ;(dest)(dest)+(src)+(CF)带进位位加法指令,主要用来实现多字节的加法运算。例:做4个字节的加法运算,两个数放在SI和DI开始的存储单元当中。MOVAX,[SI]ADD[DI],AXMOVAX,[SI+2]ADC[DI+2],AX;注意要用带进位的加法运算指令以上两条指令影响A,C,O,P,S,Z6个标志位。注意带进位位加法中的进位位的值是上一条运算指令产生的结果。3.38086指令系统加法运算指令例3.20:ADDWORDPTR[BX+106BH],1234H(CS)=1000H,(IP)=0300H,(DS)=2000H,(BX)=1200H3.38086指令系统INCdest ;(dest)(dest)+1自加1指令,影响A,O,P,S,Z5个标志位AAA加法的ASCII调整指令,它不能单独使用,总是跟在加法指令后,对在AL中的由两个非压缩的BCD码相加的结果进行校正,结果仍以非压缩BCD码的形式存放,个位在AL,十位在AH。DAA加法的十进制调整指令,它不能单独使用,总是跟在加法指令后,对在AL中的由两个压缩的BCD码相加的结果进行校正,产生一个正确的BCD码的和。3.38086指令系统AAA指令的具体算法如下:IF(ALAND0FH)>9OR(AF=1)THENAL=AL+6AH=AH+1AF=1AL=ALANDOFHCF=1ELSEAF=0CF=0ENDIF3.38086指令系统DAA指令的算法如下:IF(ALAND0FH)>9OR(AF=1)THENAL=AL+6AF=1ENDIFIF(AL>9FH)OR(CF=1)THENAL=AL+60HCF=1ENDIF3.38086指令系统例3.21:求6+7(非压缩十进制数)指令如下:MOV AL,06MOV BL,07ADD AL,BLAAA00000110+00000111(AL)=00001101因为(AL)>9,要调整+00000110(AL)=00010011(AH)=1,(AL)=ALAND0FH=033.38086指令系统例3.22:求48+29(压缩的十进制数)程序如下:MOV AL,48HADD AL,29HDAA01001000+0010100101110001AF=1调整+0000011001110111例3.23:上例中若是非压缩的十进制数,两个数放在存储单元UP1、UP2中,运算结果放在DX中,则设(UP1)=08,(UP2)=09,(UP1+1)=04,(UP2+1)=02,这里UP1、UP2是存储单元的符号地址,编程计算48+29。3.38086指令系统SUBdest,src;(dest)(dest)-(src)减法指令:SUBAL,65HSBBdest,src;(dest)(dest)-(src)-(CF)带借位位减法指令以上两条指令影响A,C,O,P,S,Z6个标志位。DECdest;(dest)(dest)-1自减1指令,影响A,O,P,S,Z5个标志位AAS减法的ASCII调整指令,对在AL中的由两个非压缩的BCD码相减的结果进行校正,结果仍以非压缩BCD码的形式存放,个位在AL,十位在AH。DAS减法的十进制调整指令,对在AL中的由两个压缩的BCD码相减的结果进行校正,产生一个正确的BCD码的差。减法运算指令3.38086指令系统AAS指令的具体算法如下:IF(ALAND0FH)>9OR(AF=1)THENAL=AL-6AH=AH-1AF=1AL=ALANDOFHCF=1ELSEAF=0CF=0ENDIF3.38086指令系统DAS指令的算法如下:IF(ALAND0FH)>9OR(AF=1)THENAL=AL-6AF=1ENDIFIF(AL>9FH)OR(CF=1)THENAL=AL-60HCF=1ENDIF3.38086指令系统例3.24:若(AL)=9AH,执行指令SUBAL,65H后,各标志位的值?9AH-65H=9AH+(-65H),这里9AH本身是负数补码[-65H]补=10011011=9BH100110109AH+100110119BH100110101可以根据以前讲过的溢出判断方法来判断是否溢出。次高位无进位,最高位有进位,所以OF=1,SF=0,ZF=0,AF=1,PF=1,CF=1,运算结果溢出。需要修正,修正办法是将符号位变成1,则结果变成10110101,此数是补码,其原码为11001011,真值是-75=-4BH。实际上,9AH=(10011010)补,其真值是-102,65H=101-102-101=-203=(-128)+(-75),其中-128舍去3.38086指令系统例3.25:求7231-2958(压缩十进制数)程序:MOVAL,31H0011000131 SUBAL,58H-0101100058 DAS11011001AF=1CF=1 MOVBL,AL-01100110 MOVAL,72H01110011结果73SBBAL,29H0111001072 DAS-00000001减CF MOVBH,AL01110001结果存放在BX中,-0010100129(BX)=427301001000AF=1-0000011001000010结果42CMPdest,src ;(dest)-(src)比较指令。完成两个操作数相减,结果反映在标志位上,但不送回结果。用于比较两个操作数的大小关系。(1)若任意两个数CMPA,BZF=0A<>B(JNZ不等转移)ZF=1A=B(JZ相等转移)(2)若两个数都是无符号数CF=0A≥B(JNC)CF=1A<B(JC) (3)若两个数都是同符号数SF=0A≥B(JNS)SF=1A<B(JS)(4)若两个数是任意带符号数SF⊕OF=0A≥B(JNL)SF⊕OF=1A<B(JL)3.38086指令系统例3.26:比较54与24的大小54-24=54+(-24)[-24]补=11101000,[54]补=0011011000110110+11101000100011110OF=0,SF=0,则目的>源,即54>24例3.27:比较24与54的大小24-54=24+(-54)00011000+1100101011100010OF=0,SF=1,则目的〈源,即24〈543.38086指令系统求补指令:NEGdest求补是把操作数按位求反后,在最低位加1。即0FFFFH-(dest)+1(dest)例3.27:若(BX)=6780H,执行NEGBX后,BX)=?0000H-6780HFFFFH-6780H+119880H=0000-6780H=9880H执行指令后,(BX)=9880H,是-6780的补码CF=1,OF=0,ZF=0,PF=0,AF=0,SF=1即对求补得到-6780的补码3.38086指令系统MULsrc;无符号数乘法指令只影响标志位OF和CF,其他状态标志在执行MUL指令后无定义。若运算结果高字节(或高字)有效,则OF=1,CF=1。字节型乘法,一个乘数在AL中,在指令中给出另一个乘数,结果放在AX中;字型乘法,一个乘数在AX中,指令中给出另一个乘数,结果为双字,高16位在DX中,低16位在AX中。IMULsrc;有符号数乘法指令功能上和MUL类似,只是要求两个乘数必须是有符号数。AAM;乘法的ASCII码调整指令不能单独使用,只能用在MUL指令后。对两个非压缩的BCD码相乘的结果进行调整,其结果也是一个非压缩的BCD码。调整算法:AH=AL/10AL=ALMOD10乘法没有十进制调整指令3.38086指令系统乘法运算指令例3.28:MULBL指令执行前:AL=B4H=180,BL=11H=17指令执行后:AX=0BF4H=3060例3.29:IMULBL指令执行前:AL=B4H=-76,BL=11H=17指令执行,先将AL的符号去掉,即76=4CH,先进行4CH×11H=050CH。再进行符号处理,正负得负,即乘积应该是负数,因此将结果050CH求补码:[050CH]求补=FAF4H,真值为-1292指令执行后,AX=FAF4H,(-76)×17=-1292。3.38086指令系统DIVsrc:无符号数除法指令8位除法:AX/src的商在AL中,AX/src的余数在AH中16位除法:(DX,AX)/src的商在AX中,余数在DXIDIV源:有符号数除法指令在功能上与DIV相类似,差别是IDIV指令执行时,要将除数和被除数看成符号数。AAD:除法的ASCII调整指令不能单独使用,只能用在DIV指令前。对非压缩的BCD码除法运算的调整,是在进行除法运算之前,通过对除数和被除数进行调整来实现的。调整算法:AL=AH*10+ALAH=0;除法也没有十进制调整指令CBW:将AL中字节的符号位扩展到AH中,成为字CWD:将AX中字的符号位扩展到DX中,成为双字除法运算指令3.38086指令系统例3.30:DIV BL指令执行前,AX=0400H,BL=B4H,即AX为无符号数1024,BL为无符号数180。指令执行后,AH=7CH(余数),AL=05H(商)例3.31:IDIV BL指令执行前,AX=0400H,BL=B4H(补码),AX为有符号数,而BL为有符号数-76。指令执行,先将BL=B4H求补,[B4H]求补=4CH=76,正数除以负数,商为负数,必须对除法结果的商求补:(0DH)求补=F3H,其真值为-13;余数为24H=36D。3.38086指令系统位操作指令ANDdest,src;按位与指令,(dest)(dest)&(src)ORdest,src;按位或指令,(dest)(dest)∧(src)XORdest,src;按位异或指令,(dest)(dest)⊕(src)NOTdest;取反指令,字节求反(dest)FFH-(dest)字求反(dest)FFFFH-(dest)TESTdest,src;测试指令(dest)&(src)与AND指令类似,只是不改变目的操作数的内容,仅影响标志位。3.38086指令系统3逻辑运算指令xxxxxxxx(BL)000011110F0000xxxx结果ANDxxxxxxxx(BL)000011110Fxxxx1111结果ORxxxxxxxx(BL)000011110Fxxxxxxxx结果XORAND主要用于将二进制数的某些位清0;OR主要用于将二进制数的某些位置1;XOR主要用于将二进制数的某些位求反位操作的用途3.38086指令系统例3.32:要求屏蔽一字节中的高4位(所谓屏蔽,就是将屏蔽位清0),可用ANDAL,0FH来实现。指令执行前AL=39H指令执行后AL=09H例3.33:ORAL,80H,使AL中内容的最高位置1,其余位不变。指令执行前AL=2BH指令执行后AL=ABH例3.34:使寄存器清零,可以执行XORAX,AX,自己与自己异或,结果为0,若AX=1ADEH,执行该指令后,AX=0000H。3.38086指令系统移位指令SHL/SALdest,计数;逻辑和算术左移指令SHRdest,计数;逻辑右移指令SARdest,计数;算术右移指令ROLdest,计数;不带进位循环左移指令RORdest,计数;不带进位循环右移指令RCLdest,计数;带进位循环左移指令RCRdest,计数;带进位循环右移指令3.38086指令系统3.38086指令系统注意以下几点:8086移位指令中的计数是指移位次数,若该次数为1可直接写在指令中。如:SHRAL,1若要移位多次,其次数必须放在CL寄存器中。如:MOVCL,4 SHRAL,CL;AL的内容逻辑右移4次移位指令常用来做乘以2或除以2的操作SHL、SAL用来乘以2SHR、SAR用来除以23.38086指令系统例3.34:用以下程序来完成X*10。 SAL AL,1 ;X*2 MOV BL,AL ;暂存 SAL AL,1 ;X*4 SAL AL,1 ;X*8 ADD AL,BL ;X*10例3.35:将一个四字节数整个左移一位。 SAL FIRST_WORD,1RCL SECOND_WORD,13.38086指令系统串操作指令对字节串或字串进行每次一个元素(字节或字)的操作,被处理的串长度可达64K字节。串操作指令使用隐含寻址方式,源串地址为DS:SI,目的串地址为ES:DI,待处理串的长度放在CX中。串操作的重复前缀包括:REP;REPE/REPZ;REPNE/REPNZ;串操作SI和DI的增长方向由DF标志给出,DF=0地址增量,DF=1地址减量。3.38086指令系统4串操作指令MOVSB/MOVSW串传送指令将一个字节/字从DS:SIES:DI执行指令前要先将源串首地址DS:SI目标串首地址ES:DI完成操作后自动修改SI、DI,使其指向串的下一个元素。串操作方向由CLD和STD指令设置 CLD地址递增方向(DF=0) STD地址递减方向(DF=1)REPMOVSB/REPMOVSW带有重复操作前缀的串传送指令在执行此操作前,需要先将串的长度存入CX寄存器,每处理完一个元素自动使CX-1,直到CX=0才结束串传送,完成整个串的传送。3.38086指令系统MOVSI,OFFSETS1MOVDI,OFFSETS2MOVCX,18 ;CLDAGAIN:MOVSB DECCX JNZAGAIN ……S1DB‘Thisisastring!$’S2DB18DUP(0)REPMOVSB3.38086指令系统REPMOVSB;REP是无条件重复DS=1000H,SI=2000H,ES=3000H,DI=1020H,CX=0064H,DF=03.38086指令系统串比较指令[REPZ/REPNZ]CMPSB[REPZ/REPNZ]CMPSW比较DS:SI所指的字节/字和ES:DI所指的字节/字比较之后自动修改地址指针。REPZ表示相等重复,即(CX)≠0且(ZF)=1继续比较;REPNZ表示不等重复,即(CX)≠0且(ZF)=0继续比较;比较指令前通常加重复前缀REPZ/REPE,从而当发现两个串不同时结束比较。3.38086指令系统例: MOV SI,OFFSETS1 MOV DI,OFFSETS2 MOV CX,xx REPZ CMPSB ;相等(Z=1)重复 JNZ Not_EqualEqual : ……Not_Equal: …...3.38086指令系统串扫描指令[REPZ/REPNZ]SCASB[REPZ/REPNZ]SCASW在首地址为ES:DI的串中搜索某个关键字(字节/字),该关键字必须放在AX或AL中。指令前通常加重复前缀REPNZ/REPNE,从而当发现待搜索的元素时结束搜索。3.38086指令系统例: MOVDI,OFFSETString MOVCX,xx MOVAL,‘h’ REPNZSCASB;不等(Z=0)重复 JNZNot_FoundFound: ……Not_Found: ……3.38086指令系统串装入指令LODSBLODSW将地址为DS:SI的一个字节/字装入AL/AX。串装入指令没有重复前缀。例: MOVSI,OFFSETString MOVCX,xx MOVAH,2NextChar:LODSB MOVDL,AL INT21 LOOPNextChar3.38086指令系统串送存指令[REP]STOSB[REP]STOSW将AL/AX的值存入地址为ES:DI的内存单元。利用重复前缀REP,可以建立一个取值相同的数据串。例:CLDLEADI,[0400H]MOVCX,128XORAX,AXREPSTOSW;ES:[0400H]开始的256个字节清03.38086指令系统串传送MOVSB/BW:将源串(DS:SI)目的串(ES:DI),SI和DI自动加1/2或减1/2。串比较CMPSB/W:将源串(DS:SI)和目的串(ES:DI)比较,不影响内容,SI和DI自动加1/2或减1/2。串扫描SCASB/W:将关键字AL(AX),和目的串(ES:DI)的内容比较,SI不变,DI自动加1/2或减1/2。串装入LODSB/W:将源串(DS:SI)AL(AX),SI自动加1/2或减1/2,DI不变。串存储STOSB/W:将AL(AX)目的串(ES:DI),SI不变,DI自动加1/2或减1/2。3.38086指令系统例3.36:将1000H开始的10个字节移动到2000H开始的单元MOVSI,1000H;置源操作数起始地址MOVDI,2000H;置目的操作数起始地址MOVAX,DS;将DS和ES段统一,比PUSHDSMOVES,AX;POPES要快MOVCX,0AH;初始化CX为10,移动10个字节CLD ;使DF=0,使地址作增量变化REPMOVSB;(ES:DI)←(DS:SI),SI←SI+1,;(DI)←(DI)+1INT3 ;断点指令3.38086指令系统例3.37:将1000H开始的10个字节移动到1002H开始的单元去。MOVCX,0AHSTDMOVSI,1009H ;1000H+9MOVDI,100BH ;1002H+9PUSHDSPOPESREPMOVSBINT33.38086指令系统段内转移是通过将目标偏移地址传送给指令指针寄存器IP来实现。段间转移不仅要将目标的地址的偏移地址送到IP中,而且要将目标地址的段地址送到段寄存器CS中。直接转移是将目标地址偏移量直接放在指令中。间接转移是将目标地址偏移量放在寄存器或存储器中。相对转移:转移目标地址是相对于该指令而言。一般在同一段内,所有段内转移都是相对转移。绝对转移:a段内间接转移,CS不变,IP值放在寄存器或存储器中。b段间直接转移,新的CS和IP值,指令给出全部两个16位数。c段间间接转移,目标地址的CS和IP都放在存储器的4个连续单元中,前2个是偏移地址,后2个是段基址。3.38086指令系统5控制转移指令当程序发生转移时,CS和IP的值可由指令指定。段间转移或段间调用可用FAR表示段内转移(-32768—32767)或段内调用可用NEAR表示若短距离内的转移(-128-127),称为短转移,用SHORT表示

3.38086指令系统JMP;无条件转移指令例:JMP1025H ;段内直接转移JMP25H ;段内直接短转移JMPBX ;段内间接转移JMP3500H:080BH;段间直接转移JMPDWORDPTR[BX+010AH];段间间接转移,目标地址存;放在DS段从BX+010AH开始;的4个存储单元中3.38086指令系统JMPSHORTOPR;段内直接短转移;(IP)←(IP)+8位位移量JMPNEARPTROPR;段内直接近转移;(IP)←(IP)+16位位移量JMPWORDPTROPR;段内间接近转移;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论