第三章 80X86指令系统和寻址方式_第1页
第三章 80X86指令系统和寻址方式_第2页
第三章 80X86指令系统和寻址方式_第3页
第三章 80X86指令系统和寻址方式_第4页
第三章 80X86指令系统和寻址方式_第5页
已阅读5页,还剩192页未读 继续免费阅读

下载本文档

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

文档简介

第3章80x86的指令系统和寻址方式§3.1 80x86的寻址方式§3.3 80x86的指令系统§3.4 80x86的机器语言指令概况基本概念—指令系统 每一种计算机都有一组指令集供用户使用,这组指令集称为该计算机的指令系统。指令集中的每条指令在汇编语言中都是用助记符来表示的。基本概念—指令的构成指令由操作码和操作数两部分组成操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分操作数是指令执行的参与者,即各种操作的对象有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数操作码操作数基本概念—8086指令的基本格式操作码 [目的操作数][,源操作数]][;注释]DESTSRC[]内的内容可缺省书写注意事项:操作码与操作数至少有一个空格或制表符分隔操作数之间必须用“,”相分隔,DEST在前,SRC在后每种指令的操作码:用一个唯一的助记符表示(指令功能的英文缩写)对应着机器指令的一个二进制编码操作数类型按照指令处理的操作数存放位置分:存储器类型:操作数存放在主存中,A为其地址信息寄存器类型:操作数存放在CPU的通用寄存器中,A为寄存器号立即数类型:操作数存放在指令(地址字段)中指令中的操作数:可以是一个具体的数值可以是存放数据的寄存器或指明数据在主存位置的存储器地址基本概念—寻址方式在指令中为了取得操作数地址所使用的方式寻找操作数的过程就是操作数的寻址不同的指令系统都规定一些寻址方式供编程时选用指令的寻址方式主要由操作数的形式表示出来操作数采取哪一种寻址方式,会影响机器运行的速度和效率§3.1 80x86的寻址方式一、与数据有关的寻址方式二、与转移地址有关的寻址方式立即(数)寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址串操作寻址端口寻址操作数可以是一个具体的数值可以是存放数据的寄存器指明数据在主存位置的存储器地址位移量:指令中给出16位数(常数、符号)EA 基地址:由基址寄存器BX或基址指针BP给出 变址:由变址寄存器(SI或DI)给出1.立即(数)寻址指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中)这种操作数被称为立即数imm它可以是8位数值i8(00H~FFH)也可以是16位数值i16(0000H~FFFFH)立即数寻址方式常用来给R/M赋值立即数只能用于源操作数立即数寻址指令MOVAL,05H ;AL←05HMOVAX,0102H ;AX←0102H立即数寻址的功能立即数寻址的执行例、

MOVAX,3064H

指令执行后,(AX)=3064H

下图表示了它的执行情况,图中指令存放在代码段中,OP表示该指令的操作码部分,3064H为立即数,它是指令的一个组成部分。

2.寄存器寻址:

它使用CPU的内部寄存器来存放要处理的操作数,寄存器号由指令指定。

可以是:8位寄存器: AH、AL、BH、BL、CH、CL、DH、DL16位寄存器: AX、BX、CX、DX、SI、DI、BP、SP4个段寄存器seg: CS、DS、SS、ES

MOVAX,1234H ;AX←1234H MOVBX,AX ;BX←AX寄存器寻址的功能寄存器寻址的执行存储器操作数的寻址当操作数存放在内存中时,寻找操作数归结为如何确定存储单元的地址逻辑地址 段基值:偏移量由段寄存器的内容给出主要确定该部分的内容(EA)物理地址=(段寄存器)×16+EA位移量:指令中给出16位数(常数、符号)EA 基地址:由基址寄存器BX或基址指针BP给出 变址:由变址寄存器(SI或DI)给出在实际寻址过程中,可能包含不同部分,EA为它们的相加之和,可在64KB范围内寻址。构成EA的3个分量的不同组合,形成了不同的寻址方式。3.直接寻址:有效地址在指令中直接给出 操作数的16位偏移量直接包含在指令中,与操作码一起放在代码段中用符号表示的位移量MOVBX,VAR ←

→ MOVBX,DS:VAR;表示将用符号VAR表示的字单元的内容→AX;不声明段则默认为数据段,指明段寄存器则可实现段跨越用常数表示的位移量MOVAX,DS:[2000H];表示将数据段偏移2000H字节的字单元的内容→AX在这种寻址方式中,操作数存放在存储单元中,而这个存储单元的有效地址就在指令的操作码之后,操作数的物理地址可通过段基地址再加上这个有效地址形成。直接寻址的功能MOVAX,DS:[2000H]直接寻址的执行MOVAX,DS:[2000H]例:MOVAX,[2000H]EA=2000H,假设(DS)=3000H,那么PA=32000H

5030AHAL50(AX)=3050

H3200030例如:

MOVAX,DATA

MOVAX,[DATA]

这里DATA是存放操作数单元的符号地址。

直接寻址方式默认操作数在数据段中,如果操作数定义在其它段中,则应在指令中指定段跨越前缀。

例如:

MOVAX,ES:NUMBER

MOVAX,ES:[NUMBER]

这里NUMBER是附加段中的字变量。(2)所使用的寄存器相当于地址指针,当修改其内容后可指向不同的存储单元(3)书写时用[]括住寄存器名,以区别于寄存器寻址.4.寄存器间接寻址:

寄存器间接寻址得到的操作数存放在内存储器中,而操作数的偏移地址EA在指令指明的寄存器中,即寄存器的内容为操作数的偏移地址EA。(1)操作数的偏移地址包含在变址寄存器(DI或SI)、基址寄存器(BX或BP)之一中;当以SI、DI、BX间接寻址,操作数默认在数据段,操作数物理地址由数据段寄存器DS与SI或DI或BX中的偏移地址构成;当以BP间接寻址,操作数默认在堆栈段,操作数物理地址由堆栈段寄存器SS与BP中的偏移地址构成。使用段超越前缀改变段。即:若用寄存器SI,DI,BX间接寻址,则操作数在当前数据段中。

PA=(DS)×10H+EA若用寄存器BP间接寻址,则操作数在当前堆栈段中。

PA=(SS)×10H+EA寄存器间接寻址的功能寄存器间接寻址的执行例:MOVAX,[BX]PA=16d×(DS)+(BX)MOVAX,ES:[BX]PA=16d×(ES)+(BX)MOVAX,[BP]PA=16d×(SS)+(BP)*不允许使用AX、CX、DX存放

EA

5.寄存器相对寻址方式直接变址寻址,基址寻址,变址寻址有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI

EA=BX/BP或SI/DI+0/8/16位位移量段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变该方式不仅可以修改指针,还可以修改位移量,对数组操作十分方便基址寻址变址寻址基址寻址:偏移地址是指令中给定的偏移量和寄存器BX或基数指针BP的内容之和;BX作为基址寄存器时且无段超越时,物理地址由DS和偏移地址形成;BP作为基址寄存器时且无段超越时,物理地址由SS和偏移地址形成。例如:MOVBX,DELTA[BP]变址寻址:操作数的偏移地址为指令中给定的8位或16位偏移量和变址寄存器SI或DI内容之和;操作数的物理地址由DS和偏移地址形成。若指明是段超越的,则以指令中指定的段寄存器为基准。例如:MOVAX,COUNT[DI]5.寄存器相对寻址方式MOVAX,10H[SI] ←

MOVAX,DS:10H[SI]MOVAX,ARRAY[BX]←

MOVAX,DS:ARRAY[BX]MOVTABLE[DI],AL ←

MOVDS:TABLE[DI],ALMOVTABZ[BP],BL ←

MOVSS:TABZ[BP],BL寄存器相对寻址的功能寄存器相对寻址的执行代码段DS数据段操作码24H00H12H34H56H78H9AHMOVAL,0024H[SI]0024H(SI)=0 (AL)=12H(SI)=1 (AL)=34H(SI)=2 (AL)=56H(SI)=3 (AL)=78H(SI)=4 (AL)=9AHEA=24H+(SI)(SI)可看作数据起始单元的偏移量数组内某元素距数组起始单元的偏移通过修改SI可遍历整个数组6.基址变址寻址方式:

操作数的偏移地址为基址寄存器BX或BP的内容加上变址寄存器SI或DI的内容之和;

若用BX作为基址寄存器,则操作数在数据段中;若用BP作为基址寄存器,则操作数在堆栈段中。

有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变6.基址变址寻址方式MOVAX,[BX][SI]

MOVAX,DS:[BX+SI]MOVAX,[BP][DI] ←

MOVAX,SS:[BP+DI]MOVAX,DS:[BP][DI] ←

MOVAX,

DS:[BP+DI]基址变址寻址的功能请指出图中的错误!基址变址寻址的执行例、MOVAX,[BX][DI](或写为MOVAX,[BX+DI])

设(DS)=2100H,(BX)=0158H,(DI)=10A5H

则EA=0158H+10A5H=11FDH

物理地址=21000H+11FDH=221FDH

指令执行情况如下图所示,最后的执行结果是(AX)=1234H。

7.相对基址变址寻址方式:有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:EA=BX/BP+SI/DI+8/16位位移量该方式中,BX/BP选一,SI/DI选一段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变7.相对基址变址寻址方式MOVAX,06H[BX+SI] ←

MOVAX,DS:[BX+SI+06H]MOVAL,TAB[BX][DI]←

MOVAL,DS:TABLE[BX][DI]MOVDWORD[BP][SI],DX ←

→MOVSS:DWORD[BP][SI],DX

MOVAX,ARRAY[BX][BP] ×MOVAX,DA[SI][DI] ×31A003000:1A00例如:MOVAX,MASK[BX][SI]BX、SI分别存放数组的脚标MOVAL,ARRAY[BX][SI]DS数据段ARRAYSIBX二维数组起始单元⊕

EA[]之间表示相加的关系 [BX][SI]←

→[BX+SI]二、与转移地址有关的寻址方式程序代码亦存放在存储器中,如何控制程序的走向(转移位置的地址CS:IP)是本部分所涉及的内容,由于它们与具体的指令相关,他们的介绍放在指令中讲解。§3.3 80x86的指令系统指令分类功能格式数据传送指令算术运算指令逻辑指令串操作指令程序转移指令处理器控制指令双操作数指令(DEST,SRC)单操作数指令(DEST)无操作数指令(隐含,按约定寻找操作数)一、数据传送指令数据传送是计算机中最基本、最重要的一种操作传送指令也是最常使用的一类指令传送指令把数据从一个位置传送到另一个位置除标志寄存器传送指令外,均不影响标志位重点掌握MOVXCHGXLATPUSHPOPLEA1.通用数据传送指令提供方便灵活的通用传送操作有3条指令MOVXCHGXLAT1) 传送指令MOV(move)格式:MOVDEST,SRC功能:将源操作数的内容传送至目的操作数中即(DEST)←(SRC)说明:DEST可以是8/16位的R(CS、IP除外)/MSRC可以是8/16位的R/M/立即数只能出现在源操作数的位置1)传送指令MOV—立即数传送MOVreg/mem,imm ;立即数送寄存器或主存moval,4 ;(al)←4,字节传送movcx,0ffh ;(cx)←00ffh,字传送movsi,200h ;(si)←0200h,字传送movbyteptr[si],0ah ;byteptr

说明是字节操作movwordptr[si+2],0bh

;wordptr

说明是字操作注意立即数是字节量还是字量明确指令是字节操作还是字操作1)传送指令MOV

—寄存器之间数据传送MOVreg,regmov

ax,bx ;(ax)←(bx),字传送movah,al ;(ah)←(al),字节传送mov

ds,ax ;(ds)←(ax),字传送

CS只能出现在SRC的位置1)传送指令MOV

—寄存器与存储器之间数据传送MOVAL,D_BYTEMOVDX,[BP] ;DX←SS:[BP]MOVDL,[SI] ;DL←DS:[SI]1)传送指令MOV

—使用该指令应注意的问题SRC与DEST的长度必须一致

错误示例: MOVAX,BL MOVCL,3824HDEST不能为CS、IP及立即数

错误示例: MOVVAR1,VAR2

正确实现: MOVAL,VAR2 MOVVAR1,ALSRC与DEST不能同时为存储器操作数—8086不支持两个存储单元间数据的直接传送SRC与DEST不能同时为段寄存器

例: DS←ES

错误: MOVDS,ES正确实现: MOVAX,ES MOVDS,AX不能将立即数直接传送到段寄存器例: MOVAX,ES

MOVDS,AX1)传送指令MOV—数据传送方向示意立即数段寄存器CSDSESSS通用寄存器AXBXCXDXBPSPSIDI存储器2)交换指令XCHG(exchange)指令格式: XCHGDEST,SRC指令功能: (DEST)←

(SRC)

寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据注意:不能在存储器与存储器之间对换数据

2)交换指令XCHG—寄存器间交换movax,1234h ;ax=1234hmovbx,5678h ;bx=5678hxchg

ax,bx

;ax=5678h,bx=1234hxchgah,al ;ax=7856h2)交换指令XCHG

—寄存器与存储器交换xchgax,ds:[2000h] ;字交换;等同于xchgds:[2000h],axxchgal,ds:[2000h] ;字节交换;等同于xchgds:[2000h],al2)交换指令XCHG—例题分析例:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H,在指令XCHGBX,[BP+SI]执行后,相关寄存器和存储器的内容是什么?分析:源操作数的物理地址= (SS)×16+(BP)+(SI)= 2F000H+0200H+0046H=2F246H指令的功能:(BX)←

(2F246H)指令执行结果:(BX)=4154H,(2F246H)=6F30H3)换码指令XLAT(translate)指令格式:

XLAT指令功能:AL←DS:[BX+AL],将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码表格首地址存放于BX,AL存放相对表格首地址的位移量换码指令执行后:将AL寄存器的内容转换为目标代码movbx,100hmoval,03hxlat(BX)(AL)DS数据段12H34H56H78H9AH78H(AL)=78H3)换码指令XLAT—例题2.堆栈操作指令—进栈指令PUSH格式: PUSHSRC功能: SP←SP-2, SS:[SP]←(r16/m16/seg)例:pushaxpushDS:[2000h]2.堆栈操作指令—出栈指令POP格式: POPDEST功能: (r16/m16/seg)←SS:[SP]

SP←SP+2,

例:popDXpopDS:[2000h]2.堆栈操作指令—应用举例pushax ;进入子程序后pushbxpushds...popds

;返回主程序前popbxpopax3.地址传送指令地址传送指令将存储器单元的逻辑地址送至指定的寄存器有效地址传送指令LEA指针传送指令LDS和LES注意不是获取存储器单元的内容3.地址传送指令

—有效地址传送指令LEA(loadEA)格式:LEADEST,SRC16位寄存器存储器操作数功能:DEST←SRC的有效地址EA

将存储器操作数的有效地址传送至指定的16位寄存器中LEABX,BUFR9A78H(BX)=9A78H3.地址传送指令

—有效地址传送指令LEA(例)23H093A0HBUFR78H9AH093AHDS093C3H(BX)=0023H错误!获得主存单元的有效地址;不是物理地址,也不是该单元的内容可以实现计算功能3.地址传送指令 —地址指针存储单元的逻辑地址段基值(16位)段内偏移量(16位)地址指针(32位) M的逻辑地址在M中需4个连续的存储单元段基值AD_POINTXXXX偏移量XXXX3.地址传送指令 —指针传送指令格式:LDSDEST,SRC功能:(DEST)←(SRC)段内偏移量DS←(SRC+2)段基值LDS指令将主存中SRC

指定的字送至16位寄存器DEST,并将SRC的下一字送DS寄存器格式:LESDEST,SRC功能:(DEST)←(SRC)段内偏移量ES←(SRC+2)段基值LES指令将主存中SRC

指定的字送至16位寄存器DEST,并将SRC的下一字送ES寄存器例:(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H,(405AEH)=9634H,在执行指令

LDSDI,[BX] MOVAX,[DI]

后,(AX)=?BX=080AHB0000H0B080AH40000H34H96HAEH05H00H40H405AEH05AEH0B080CH(DI)=05AEH(DS)=4000H结果: (DS)=4000H(DI)=05AEH(AX)=9634H例、设执行前(DS)=2000H,(DI)=1050H,COUNT=100H,执行LDSSI,COUNT[DI]

4.标志寄存器传送指令标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作有2对4条指令低8位传送:LAHF和SAHF16位传送:PUSHF和POPF4、标志寄存器传送指令

—标志低字节进出AH指令格式:LAHF功能:(AH)←FLAGS的低字节LAHF指令将标志寄存器的低字节送寄存器AHSF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意格式:SAHF功能:FLAGS的低字节←(AH)SAHF将AH寄存器内容送FLAGS的低字节用AH的第7/6/4/2/0位相应设置SF/ZF/AF/PF/CF标志4.标志寄存器传送指令—

标志寄存器进出堆栈指令格式:PUSHF功能:SP←SP-2SS:[SP]←FLAGSPUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2格式:POPF功能:FLAGS←SS:[SP] SP←SP+2POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加24.标志寄存器传送指令—

标志寄存器进出堆栈指令(置位单步标志)pushf

;保存全部标志到堆栈popax ;从堆栈中取出全部标志orax,0100h ;设置D8=TF=1,ax其它位不变pushax ;将ax压入堆栈popf ;FLAGS←AX;将堆栈内容取到标志寄存器二、算术运算指令(部分)四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算请注意算术运算类指令对标志的影响1.加/减法指令格式: ADDDEST,SRC SUBDEST,SRC功能: (DEST)←(DEST)+/-(SRC)受影响标志:CF,PF,AF,ZF,SF,OF说明:操作数可以是字节或字SRC可以是通用R、M、immDEST可以是通用R、MDEST和SRC不能同时为M

进位标志

奇偶标志

辅助进位标志

零标志

符号标志

溢出标志

CF:当结果的最高位产生进位时,CF=1,否则CF=0。

OF:当带符号数运算的结果超出其所能表示范围,则OF=1,否则OF=0。

PF:结果中含"1"的个数为偶数,则PF=1,否则PF=0。

SF:结果最高位为1,则SF=1,否则SF=0。

ZF:结果为零,则ZF=1,否则ZF=0。

AF:字节运算时D3产生进位;字运算时D7产生进位,则AF=1,否则AF=0。1.加法指令—举例ADDAX,BXADDAL,BLSUBCX,20HADDDL,DA_BYTESUBDA_WORD,DX若(AL)=0E5H,执行ADDAL,0A4H后,AL及各标志位的情况?1111001011010010010001001+CF=1,AF=0,PF=0,ZF=0,SF=1,OF=0若认为是无符号数,则为229+164=393=256+137若认为是有符号数,则为(-27)+(-92)=-119例:ADDAX,2520H

2.减法指令—举例例:执行指令 MOVAL,-73 SUBAL,-87

后,AL及个标志位的情况101101111010100100001110—CF=0,AF=1,PF=0,ZF=0,SF=0,OF=0-73的补码表示14-87的补码表示AL=0EH2.带进/借位的加/减法指令格式: ADCDEST,SRC SBBDEST,SRC功能: (DEST)←(DEST)+/-(SRC)+/-CF受影响标志:CF,PF,AF,ZF,SF,OF说明:操作数可以是字节或字SRC可以是通用R、M、immDEST可以是通用R、MDEST和SRC不能同时为M

2.带进/借位的加/减法指令—举例例:实现2F365H和5E024H的加法运算 MOVDX,2 MOVAX,0F365H ADDAX,0E024H ADCDX,52F3655E0248D389+手工计算2F3655E0248D389+1F365E024D389+CF=1,AF=0,PF=0,ZF=0,SF=1,OF=0000200050008+0001CF=0,AF=0,PF=0,ZF=0,SF=0,OF=0AXDXAX3A79例:设在内存BUFFER1,BUFFER2开始的两个存区中分别存有两个四字节数(如下图),现求这两个数之和,并

把它们的结果存入以BUFFER3为首址的存区中解:完成本任务的程序段如左下所示,该程序的逐条执行过程可见下图演示

AX90F0AX3512AX40633.加/减1指令格式: INCDEST DECDEST功能: (DEST)←(DEST)+/-1将DEST指定的寄存器或存储器内容加1或减1,然后送会寄存器或存储器

受影响标志:PF,AF,ZF,SF,OF;但不影响CF说明:DEST可以是字节或字R、M功能与ADD/SUB相似,但占用字节少,且不影响标志位CF

。常用于修改地址指针及循环计数器。 例、设X、Y、Z均为双精度数,他们分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中;W,W+2单元存放运算结果;编写实现下列二进制运算的程序段

WX+Y+24-Z

MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2ADDAX,24ADCDX,0SUBAX,ZSBBDX,Z+2MOVW,AXMOVW+2,DX4.求补指令(求负数)格式: NEGDEST功能: (DEST)←0-(DEST)受影响标志:CF,PF,AF,ZF,SF,OF说明:DEST可以是字节或字R、M操作对象是有符号的数当操作数取最小值(-128或-32768)时,执行该指令后,操作数无变化,OF=1当操作数为0时,结果为0,但CF=0,其他情况CF=14.求补指令(举例)例:AL=13H,执行指令

NEGAL

后AL的值1000000000001001111101101—ALAL=-13H100100100000000110010011+若AL=11010001B=[-47]补,执行NEGAL后,

AL=00101111B=+475.比较指令CMP(compare)格式: CMPDEST,SRC功能: (DEST)-(SRC)受影响标志:CF,PF,AF,ZF,SF,OF说明:DEST,SRC可以是字节或字R、M,长度必须一致SRC还可以是immDEST和SRC不能同时为M该指令主要用于比较两数的关系5.比较指令CMP—应用ZF=1 ;两数相等两个无符号数比较

CMPAX,BX ;

0 AX≥

BX1 AX<BX

CF= 两个带符号的数的比较不能用单一的符号判断两个数的关系

指令执行后SF与OF相同,(DEST)>SRCSF与OF不同,(DEST)<SRC5.比较指令CMP—(CMPAL,BL)AL=-2BL=127111111100111111101111111-SF=0OF=1相异,AL<BLAL=-2BL=-11111111101111111111111111-SF=1OF=0相异,AL<BL5.比较指令CMP—(CMPAL,BL)AL=-1BL=-2111111111111111000000001-SF=0OF=0相同,AL>BLAL=127BL=-21011111111111111010000001-SF=1OF=1相同,AL>BL6.乘法指令MULr8/m8;无符号字节乘法;AX←AL×r8/m8MULr16/m16;无符号字乘法;DX.AX←AX×r16/m16IMULr8/m8;有符号字节乘法;AX←AL×r8/m8IMULr16/m16;有符号字乘法;DX.AX←AX×r16/m166.乘法指令—功能乘法指令分无符号和有符号乘法指令乘法指令的源操作数显式给出,隐含使用另一个操作数AX和DX字节相乘:AL与r8/m8相乘,得到16位的结果,存入AX字相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX乘法指令利用OF和CF判断乘积的高一半是否具有有效数值6.乘法指令—对标志的影响

乘法指令如下影响OF和CF标志:MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1例:设在字变量A1,A2中分别存有两个16位无符号二进制数,现在要求它们的积,并将积存入以BUFFER为偏移地址的连续存区中。下面是完成此过程的程序段:

MOVAX,A1

MULA2

MOVBUFFER,AX

MOVBUFFER+2,DX6.乘法指令—(例)moval,0b4h

;al=b4h=180movbl,11h

;bl=11h=17mul

bl

;ax=Obf4h=3060,OF=CF=1,AX高8位不为0moval,0b4h

;al=b4h=-76movbl,11h

;bl=11h=17imul

bl

;ax=faf4h=-1292,OF=CF=1,AX高8位有效6.除法指令DIVr8/m8

;无符号字节除法AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数DIVr16/m16

;无符号字除法;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数IDIVr8/m8

;有符号字节除法:AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数IDIVr16/m16

;有符号字除法:;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数6.除法指令—功能除法指令分无符号和有符号除法指令除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX除法指令对标志没有影响除法指令会产生结果溢出6.除法指令—除法错中断当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断——除法错中断对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,或者在字除时商不在-32768~32767范围内,则发生除法溢6.除法指令—(例)movax,0400h

;ax=400h=1024movbl,0b4h

;bl=b4h=180divbl

;商al=05h=5,余数ah=7ch=124movax,0400h

;ax=400h=1024movbl,0b4h

;bl=b4h=-76idiv

bl

;商al=f3h=-13,余数ah=24h=367.符号扩展指令—符号扩展的概念符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。符号扩展不改变数据大小对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100)对于数据ff00H(表示有符号数-256),其最高位D15为1,符号扩展后高16位都是1,成为ffffff00H(仍表示有符号数-256)7.符号扩展指令CBW

;AL的符号扩展至AH;如AL的最高有效位是0,则AH=00;AL的最高有效位为1,则AH=FFH。AL不变CWD

;AX的符号扩展至DX;如AX的最高有效位是0,则DX=00;AX的最高有效位为1,则DX=FFFFH。AX不变符号扩展指令常用于获得双倍长的数据7.符号扩展指令—(例:AX/BX)cwd

;DX.AX←AXidiv

bx

;AX←DX.AX÷BX

利用符号扩展指令得到除法指令所需要的倍长于除数的被除数对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数例:设在字变量B1,B2中分别存有两个16位带符号二进制数,计算B1/B2,并将其商和余数分别以RESULT为偏移地址的连续存区中。下面是完成此过程的程序段:

MOVAX,B1

CWD

IDIVB2

MOVRESULT,AX

MOVRESULT+2,DX

例:课本P67。8.十进制调整指令十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果分成压缩BCD码和非压缩BCD码调整8.十进制调整指令

—压缩BCD码加、减调整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8) DAA;AL←将AL的加和调整为压缩BCD码(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8) DAS;AL←将AL的减差调整为压缩BCD码使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令DAA和DAS指令对OF标志无影响,按结果影响其他标志8.十进制调整指令—

压缩BCD码加、减调整指令(例)moval,68h ;al=68h,压缩BCD码表示真值68movbl,28h ;bl=28h,压缩BCD码表示真值28addal,bl

;二进制加法:al=68h+28h=90hdaa

;十进制调整:al=96h;实现压缩BCD码加法:68+28=96moval,68h ;al=68h,压缩BCD码表示真值68movbl,28h ;bl=28h,压缩BCD码表示真值28subal,bl ;二进制减法:al=68h-28h=40hdas

;十进制调整:al=40h;实现压缩BCD码加法:68-28=408.十进制调整指令

—非压缩BCD码加、减调整指令(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8) AAA;AL←将AL的加和调整为非压缩BCD码;AH←AH+调整的进位(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8) AAS;AL←将AL的减差调整为非压缩BCD码;AH←AH-调整的借位使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令AAA和AAS指令在调整中产生了进位或借位,则AH要加上进位或减去借位,同时CF=AF=1,否则CF=AF=0;它们对其他标志无影响8.十进制调整指令

—非压缩BCD码加、减调整指令(例)movax,0608h ;ax=0608h,非压缩BCD码表示真值68movbl,09h ;bl=09h,非压缩BCD码表示真值9addal,bl

;二进制加法:al=08h+09h=11haaa

;十进制调整:ax=0707h;实现非压缩BCD码加法:68+9=77movax,0608h

;ax=0608h,非压缩BCD码表示真值68movbl,09h

;bl=09h,非压缩BCD码表示真值9subal,bl

;二进制减法:al=08h-09h=ffhaas

;十进制调整:ax=0509h;实现非压缩BCD码减法:68-9=59例:用乘法指令实现32位二进制数的相乘cdabaxdxaxdxdxaxdxax×

+

b×da×db×ca×cDSEG SEGMENTPARA'Data‘num1 dw1220h,48a2hnum2 dw2398h,0ae41hprodu

dw4dup(0)DSEG ENDSabcdnum1num1+2num2num2+2produprodu+2produ+4produ+6三、逻辑指令 (逻辑)位操作类指令以二进制位为基本单位进行数据的操作;这是一类常用的指令,都应该特别掌握逻辑运算指令测试指令移位指令1.逻辑运算指令格式:

ANDDEST,SRC ORDEST,SRC XORDEST,SRC NOTDEST功能: (DEST)←

(DEST)(SRC)∧∨∨(DEST)←

(DEST)

受影响标志:CF=0,OF=0,

PF,ZF,SF,NOT对标志无影响1.逻辑运算指令—应用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 ;标志不变1.逻辑运算指令—应用AND指令可用于复位某些位(同0相与),不影响其他位:将BL中D3和D0位清0,其他位不变

ANDBL,11110110B

OR指令可用于置位某些位(同1相或),不影响其他位:将BL中D3和D0位置1,其他位不变

ORBL,00001001BXOR指令可用于求反某些位(同1相异或),不影响其他位:将BL中D3和D0位求反,其他不变

XORBL,00001001B XORAX,AX ;AX=0,CF=ZF=0 XOR AL,43H ;ZF=0则AL≠43H;ZF=1AL=43H则例:课本P69。例:课本P69。2.测试指令TEST格式: TESTDEST,SRC功能: 将两个操作数进行逻辑“与”运算,结果只反映在标志位上,对操作数无影响受影响标志:CF=0,OF=0

,

PF,ZF,SF说明:该指令用于测试操作数的某位是否为1,被测试的位与1相“与”

TESTAL,01H ;测试D0的值ZF=0,D0=1ZF=1,D0=0例:课本P70。3.移位指令逻辑移位指令算术移位指令循环移位指令1)逻辑移位指令格式: SHLDEST,CNT SHRDEST,CNT功能: 将DEST按CNT指定的次数左/右移位,移出的位→CF,空出的位补0,结果→DEST受影响标志:OF(CNT=1时),CF,PF,ZF,SF说明:DEST可以是字节或字R、MCNT为1或CL只在CNT=1时。CF与SF相同,OF=0;CF与SF不同,OF=1。该指令可用于无符号数÷/×2的操作逻辑左移SHLAL,12)算术移位指令格式: SALDEST,CNT SARDEST,CNT功能: SAL与SHL完全相同SAR每右移1位,最低位→CF,最高位保持不变(用于带符号数的除法),结果→DEST受影响标志:OF(CNT=1时),CF,PF,ZF,SF说明:DEST可以是字节或字R、MCNT为1或CL该指令可用于带符号数÷/×2的操作逻辑移位指令的功能移位指令应用举例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=1 SARAL,CL

;AL=03H

;CF=1,SF=0、ZF=0、PF=1SARAL,1

;AL=38H

;CF=0,SF=0、ZF=0、PF=0、OF=0mov

si,axshlsi,1 ;si←2×axaddsi,ax ;si←3×axmov

dx,bxmovcl,03hshl

dx,cl ;dx←8×bxsubdx,bx ;dx←7×bxadddx,si ;dx←7×bx+3×ax移位指令应用举例3)循环移位指令格式: ROLDEST,CNT RORDEST,CNT RCLDEST,CNT RCRDEST,CNT

功能:小循环:将DEST按CNT指定的次数左/右移位,移出的位同时送CF和空出的位大循环:将DEST按CNT指定的次数左/右移位,CF→空出的位,移出的位→

CF受影响标志:OF(CNT=1时),CF说明:用大循环可完成多字节的移位操作小循环大循环不带进位循环移位指令(小循环)带进位循环移位指令(大循环)循环移位指令

—将DX.AX中32位数值左移一位SHLAX,1RCLDX,1DXAXCF0循环移位指令—位传送;把AL最低位送BL最低位,保持AL不变RORAL,1RCLBL,1ROLAL,1ALCFBLCFALCFAL之D0循环移位指令—BCD码合并;AH.AL分别存放着非压缩BCD码的两位;将它们合并成为一个压缩BCD码存ALANDAX,0F0FH ;保证高4位为0MOVCL,4ROLAH,CL ;也可以用SHLAH,CLADDAL,AH ;也可以用ORAL,AH四、串操作指令串操作指令是8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,在操作主存连续区域的数据时,特别好用、因而常用串操作指令的操作数是主存中连续存放的数据串(String)——即在连续的主存区域中,字节或字的序列串操作指令的操作对象是以字(W)为单位的字串,或是以字节(B)为单位的字节串四、串操作指令—串寻址方式源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:DS:[SI]目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:[DI]每执行一次串操作指令,SI和DI将自动修改:±1(对于字节串)或±2(对于字串)执行指令CLD指令后,DF=0,地址指针增1或2执行指令STD指令后,DF=1,地址指针减1或2串操作(7)REP1)REP;与MOVS、STOS、LODS配合使用。(REPMOVSB/REPSTOSW)指令操作:①如(CX)=0,退出串操作,CX≠0,做下一步②CX←CX-1③执行后跟的串操作指令回到第一步重复次数由CX控制1.串传送MOVS(movestring)把字节或字操作数从主存的源地址传送至目的地址MOVSB

;字节串传送:ES:[DI]←DS:[SI] ;SI←SI±1,DI←DI±1MOVSW

;字串传送:ES:[DI]←DS:[SI] ;SI←SI±2,DI←DI±2串传送MOVSB

(正向DF=0)串传送MOVSW(反向DF=1)data1segmentstring1db'thisisadog.$'data1endsdata2segmentstring2db15dup(?)data2endscodesegmentassumecs:code,ds:data1,es:data2start:

movax,data1

mov

ds,ax

movax,data2

mov

es,axleasi,string1leadi,string2

movcx,15

cldrepmovsbcodeendsendstart例:把数据段中的thisisadog.$传送到附加段中。2.串存储STOS(storestring)把AL或AX数据传送至目的地址STOSB

;字节串存储:ES:[DI]←AL ;DI←DI±1STOSW

;字串存储:ES:[DI]←AX ;DI←DI±2例:把附加段中5个字节缓冲区置为20H。datasegmentxdb5dup(?)dataendscodesegmentassumecs:code,es:datastart:

mov

ax,data

mov

es,axleadi,x

moval,20H

movcx,5;cx←传送次数

cld;DF=0,地址增加repstosbcodeendsendstartREPZ/REPE,REPNZ/REPNE两条都与CMPS、SCAS配合使用(REPZ/REPNZCMPSB)CX≠0且ZF=1CX←CX-1执行串操作YNREPZ/REPECX=0或ZF=0退出串操作CX≠0且ZF=0CX←CX-1执行串操作YNREPNZ/REPNECX=0或ZF=1退出串操作4.串比较CMPS(comparestring)将主存中的源操作数减去至目的操作数,以便设置标志(ZF),进而比较两操作数之间的关系CMPSB

;字节串比较:DS:[SI]-ES:[DI] ;SI←SI±1,DI←DI±1CMPSW

;字串比较:DS:[SI]-ES:[DI] ;SI←SI±2,DI←DI±2注释:1)REPZ指令中的“Z”表示的是“ZF=1”,而且“ZF=1”是重复串操作的必要条件;REPNZ中的“NZ”表示的是“ZF=0”,而且“ZF=0”是重复串操作的必要条件。2)REP指令使串操作重复CX规定的次数,REPZ、REPNZ使串操作的重复可能提前结束(观察ZF)。例:比较两个字符串str1,str2是否相等,数据串长度为count,比较结果存入result单元,0表示相等,-1(ffh)表示不等。Leasi,str1Leadi,str2mov

cx,countcldrepz

cmpsb

jnz

unmat

moval,0

jmpoutputunmat:moval,0ffhoutput:mov

result,alZF=0,两串不同重复运行串比较指令的几种情况1)CX=0,ZF=1:全比完,相同2)CX=0,ZF=0:全比完,末数据不同3)CX≠0,ZF=0:未比完,遇到不同4)CX≠0,ZF=1:未比完,继续比较data1segmentstr1db'terrorist'data1endsdata2segmentstr2db'terrorist'data2endscodesegmentassumecs:code,ds:data1,es:data2start:

movax,data1

mov

ds,ax

movax,data2

mov

es,axleasi,str1leadi,str2

mov

bl,[si]

mov

bh,es:[di]incsiincdi

movcx,8

cld

cmp

bl,bh

repe

cmpsb例:比较两个字符串str1,str2是否相等,字符串长度为9,0表示相等,1表示不等。ZF=0,两串不同重复运行串比较指令的几种情况1)CX=0,ZF=1:全比完,相同2)CX=0,ZF=0:全比完,末数据不同3)CX≠0,ZF=0:未比完,遇到不同4)CX≠0,ZF=1:未比完,继续比较jnzno

moval,0;equipment

jmpexitno:

moval,1

exit:hltcodeendsendstart5.串扫描SCAS(scanstring)将AL/AX减去至目的操作数,以便设置标志(ZF),进而比较AL/AX与操作数之间的关系SCASB

;字节串扫描:(AL)-ES:[DI] ;DI←DI±1SCASW

;字串扫描:(AX)-ES:[DI] ;DI←DI±2例:课本P83。例:从字符串str(字符串长度为9)中查找字符f,0表示找到,1表示没有找到。datasegment

strdb'terrorist'dataendscodesegmentassumecs:code,es:datastart:

mov

ax,data

mov

es,ax

mov

al,'f'leadi,str

mov

bl,es:[di]incdi

movcx,8

cld

cmp

al,bl

repne

scasb

jzequip

moval,1;nofind

jmpexitequip:

moval,0;find

exit:hltcodeendsendstart注释 使用带重复前缀的串比较和串搜索指令指令时,REPZ和REPNZ的选择:对字符串比较,比较两个字符串是否相等,用REPZ(如相等,则继续比较;如遇到不等的数据则退出);如要求找出两串相等的位置,应使用REPNZ(两数据不等,继续比较);对串搜索来说,一般使用REPNZ(当前数据不是要找的,继续搜索),但有时也可能用到REPZ,如已知一个数据块应该都是0FFH,要查找其中是否有非FF,关键字(只能)用FF,重复前缀应使用REPZ。

重复前缀指令(repeat)串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在CX寄存器中重复前缀分2类,3条指令:配合不影响标志的MOVS、STOS(和LODS)指令的REP前缀配合影响标志的CMPS和SCAS指令的REPZ和REPNZ前缀1、无条件转移指令(1).段内转移·直接寻址

JMPSHORTLABEL;IP←IP+8位偏移量

JMPNEARPTRLABEL;IP←IP+16位偏移量注释:①指令中“LABEL”称为“标号”,是某一条指令的名字,其物理意义为指令在内存中的偏移地址。②段内:不改变段寄存器(在当前代码段内),只改变指令指针寄存器;直接寻址:汇编指令中直接给出了转移目标的地址,但从指令的操作来说,应属相对寻址。③短转移的转移范围:相对于JMP的下一条指令,转移范围为-128~+127;近转移:相对于JMP的下一条指令,转移范围为-32768~+32767。五、控制转移指令(2).段内转移·间接寻址

JMPr16/m16;IP←r16或IP←m16

指令举例

JMPSHORTL_PRO1;短转移,目标指令为L_PRO1JMPNEARPTR L_PRO2;JMPSI;IP←SI,通过寄存器间接给出指令偏移地址。

JMPBX;IP←BXJMPWORD PTR[BX];通过存储器间接给出指令的偏移地址,而存储器寻址方式为寄存器BX间接寻址。

JMPWORDPTR[BP+DI+20H];(3).段间转移·直接寻址

JMP(FARPTR)LABEL;IP←LABEL的偏移地址,CS←LABEL的段地址注释:“LABEL”是位于另一个代码段的某一条指令的名字;另外,指令中的“FARPTR”可以省略,因为汇编程序可以自动识别:“LABEL”与相应的“JMP”指令是否在同一代码段内,从而产生段内或段间转移指令的机器代码。… CODE2SEGMENTCODE1SEGMENT … … PRO1:MOV…JMPFARPTRPRO1 … …CODE1ENDSCODE2ENDS……操作码50020020………………CODE1段CODE2段PRO1新(IP)=0250新(CS)=200020000H20250H(4).段间转移·间接寻址JMPDWORDPTRmem;IP←(EA),CS←(EA+2)注释:通过存储器的一个双字单元提供转移目标的段地址和偏移地址,低位字为偏移地址,高位字为段地址。

JMPDWORDPTR[BX+DI]DS=4000H,BX=1230H,SI=02H计算物理地址:40000H+1230H+2=41232HCSIPx≤0?按6x-3计算函数值NY按3x计算函数值例、编写一程序计算下列分段函数:y=3x(x≤0)6x-3(x>0)2、条件转移指令条件转移指令概述①条件转移指令的通用格式为:JccOPR

如条件满足,则发生转移:IP←IP+8位偏移量如条件不满足,则不转移,顺序执行下条指令。②所有的条件转移指令均为两字节机器指令,第2字节为8位偏移量,因而转移范围与“JMPSHORT”指令相同。③指令中的条件即为状态标志的状态或状态的组合。指令功能测试条件JZ(或JE)OPR=或结果为零则转移ZF=1JNZ(或JNE)OPR≠或结果不为零则转移ZF=0JSOPR结果为负则转移SF=1JNSOPR结果为正则转移SF=0JOOPR溢出则转移OF=1JNOOPR不溢出则转移OF=0JP(或JPE)OPR奇偶位为1则转移PF=1JNP(或JPO)OPR奇偶位为0则转移PF=0无符号数比较,并根据比较结果转移指令功能测试条件JB(或JNAE,或JC)OPR<或CF=1则转移CF=1JNB(或JAE,或JNC)OPR≥或CF=0则转移CF=0JBE(或JNA)OPR≤则转移CF∨ZF=1JNBE(或JA)OPR>则转移CF∨ZF=0带符号数比较,并根据比较结果转移指令功能测试条件JL(或JNGE)OPR<则转移SFOF=1JNL(或JGE)OPR≥则转移SFOF=0JLE(或JNG)OPR≤则转移SFOF∨ZF=1JNLE(或JG)OPR>则转移SFOF∨ZF=0例:比较无符号数大小,将较大的数存放AX寄存器。CMP AX,BX;(AX)-(BX)JNB NEXT ;若AX>=BX,转移到NEXTXCHG AX,BX;若AX<BX,交换NEXT:…例:比较有符号数大小,将较大的数存放在AX寄存器。CMP AX,BX ;(AX)-(BX)JNL NEXT ;若AX>=BX,转移到NEXTXCHG AX,BX ;若AX<BX,交换NEXT:…x≤0?按6x-3计算函数值NY按3x计算函数值例、编写一程序计算下列分段函数:y=3x(x≤0)6x-3(x>0)datasegmentxdb10ydw?dataendscodesegmentassumecs:code,ds:datastart:

mov

ax,data

mov

ds,ax

mov

al,x

cmpal,0

jnley1

movbl,3

imul

bl

jmpy2y1:movbl,6

imul

blsubax,3y2:movy,axcodeendsendstart4.CX为零转移指令JCXZ语句格式:JCXZ短标号测试CX的值为0则转移指令功能测试条件JCXZOPRCX寄存器的内容为零则转移(CX)=0例、编写一程序计算1+2+3+4+5(带符号数),并把结果存入Z单元中。datasegmentzdw?dataendscodesegmentassumecs:code,ds:datastart:

mov

ax,data

mov

ds,ax

movbx,1

movax,0

movcx,5loop1:addax,bxincbx

dec

cx

jcxzexit

jmploop1exit:

mov

z,axcodeendsendstart六、循环指令1.循环指令LOOP2.相等/为零循环指令LOOPZ3.不相等/不为零循环指令LOOPNZ4.CX为零转移指令JCXZ1.循环指令LOOP语句格式:LOOP短标号测试条件:(CX)≠0指令操作:(1)、(CX)=(CX)-1;(2)、检查测试条件是否满足测试条件,如果满足则程序转移到标号处执行;否则,顺序执行。说明:使用LOOP指令可代替两条指令:DECCXJNE短标号L

温馨提示

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

评论

0/150

提交评论