微机原理与接口技术指令系统_第1页
微机原理与接口技术指令系统_第2页
微机原理与接口技术指令系统_第3页
微机原理与接口技术指令系统_第4页
微机原理与接口技术指令系统_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

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

文档简介

2023/12/61微机原理与接口技术第三章

指令系统

2023/12/62第一节

指令的基本结构和执行时间指令指令系统8086/8088CPU的指令系统共包含92种基本指令,按照功能可将它们分为6大类:•

数据传送指令•算术运算指令•逻辑运算和移位指令•串操作指令•控制转移指令•处理器控制指令2023/12/63

8086指令的一般格式如下:

操作码[操作数],[操作数]操作数主要分为3类:

立即数操作数、寄存器操作数存储器操作数。2023/12/64

表3-2隐含及允许超越的段寄存器存储器操作的类型

隐含的段寄存器

允许超越的段寄存器

偏移地址取指令

CS无

IP堆栈操作

SS无

SP通用数据读写

DSCS,ES,SS有效地址源数据串

DSCS,ES,SSSI目标数据串

ES无

DI用BP作为基址寄存器

SSCS,DS,ES有效地址2023/12/65

指令的执行时间一条指令的执行时间包括取指令、取操作数、执行指令及传送结果几部分,单位用时钟周期表示

寄存器操作数的指令执行速度最快,立即数操作数次之,存储器操作数指令的执行速度最慢

2023/12/66第二节8086的寻址方式一、立即寻址(ImmediateAddressing)

主要用于给寄存器或存储单元赋初值

MOVAX,3508H

2023/12/67

二、直接寻址(DirectAddressing)直接寻址指令在指令的操作码后面直接给出操作数的16位偏移地址。此偏移地址也称为有效地址EA(EffectiveAddress),与指令的操作码一起,存放在内存的代码段.低8位存放在低地址单元,高8位存放在高地址单元。2023/12/68

直接寻址:MOVAX,[3200H]如果DS=5000H,则所寻找的操作数的物理地址:5000H×10H+3200H=50000H+3200H=53200H

2023/12/69

段超越:MOVBX,ES:[2100H]2023/12/610

三、寄存器寻址(RegisterAddressing)操作数为CPU的内部寄存器

指令在执行过程中不必通过访问内存而取得操作数,因此执行速度很快。MOVDS,AX

2023/12/611

四、寄存器间接寻址(RegisterIndirectAddressing)MOVAX,[DI]指令中的16位寄存器的内容不是操作数,而是操作数的偏移地址,操作数本身则在存储器中。可用的寄存器有四个,分别是:SI、DI、BX和BP,但如果使用不同的间址寄存器,则相应的段寄存器有所不同

2023/12/612

1.选择SI、DI、BX作为间址寄存器操作数在数据段(没有使用段超越时)

MOVAX,[DI]若已知(DS)=5000H,(DI)=1600H,则操作数的物理地址为:5000H×10H+1600H=51600H执行的结果为(AX)=789AH2023/12/613

2.选择BP作为间址寄存器

操作数在堆栈段(没有使用段超越时)

MOV[BP],AX若已知(SS)=6000H,(BP)=1500H,则操作数的物理地址为:6000H×10H+1500H=61500H若已知(AX)=5566H,则指令的执行结果为:66H送到61500H内存单元,

55H送到61501H内存单元2023/12/614

无论用SI、DI、BX或BP作为间址寄存器,都允许段超越。

MOVES:[DI],AXMOVDX,DS:[BP]2023/12/615

五、变址寻址(IndexedAddressing)以指定的寄存器内容,加上指令中给出的8位或16位位移量(必须要以一个段寄存器作为基地址),作为操作数的地址。作为变址寻址的寄存器可以是SI、DI、BX、BP四个寄存器中的任一个

若用SI、DI和BX作为变址寄存器,操作数在数据段,即段地址在DS寄存器;若用BP变址,则操作数在堆栈段,即段地址在SS寄存器

MOVAX,2000H[SI]

若(SI)=1200H,(DS)=1500H,则操作数的地址为18200H

2023/12/616变址寻址方式

2023/12/617

六、基址-变址寻址(BasedIndexedAddressing)

将BX和BP看作基址寄存器,将SI和DI看作变址寄存器。基址加变址的寻址方式:把一个基址寄存器(BX或BP)的内容加上一个变址寄存器(SI或DI)的内容,再加上指令中指定的8位或16位位移量(必须要以一个段寄存器作为地址基址),作为操作数的地址

MOVAX,1050H[BX][SI]2023/12/618

MOVAX,1050H[BX][SI]若(BX)=2000H,(SI)=1600H,(DS)=1200H,指令中给出的偏移量为1050H,则源操作数的物理地址为16650H若用BX作为基址寄存器,则段寄存器为DS,操作数在数据段中;若用BP作为基址寄存器,则段寄存器为SS,操作数在堆栈段中。2023/12/619基址加变址的寻址方式

2023/12/620第三节8086的指令系统•

数据传送(Datatransfer)•

算术运算(Arithmetic)•

逻辑运算和移位(Logic)•

串操作(Stringmanipulation)•

控制转移(Controltransfer)•

处理器控制(Processorcontrol)2023/12/621

OPRD泛指各种类型的操作数mem存储器操作数acc累加器操作数dest目的操作数src源操作数disp8位或16位偏移量,可用符号地址表示DATA8位或16位立即数port输入输出端口,可用数字或表达式表示()表示寄存器的内容[]表示存储单元的内容或偏移地址2023/12/622一、数据传送类指令

按功能可分为以下4小类:

通用数据传送指令输入输出指令目标地址传送指令标志传送指令2023/12/623

1.通用数据传送指令(GeneralPurposeTransfer)一般传送指令MOV堆栈操作指令PUSH和POP交换指令XCHG查表转移指令XLAT字位扩展指令2023/12/624

⑴一般传送指令MOV(Movement)MOVdest,src;(dest)←(src)既可传送字节操作数(8位),也可传送字操作数(16位);可使用本章讨论过的各种寻址方式;可实现以下各种传送:2023/12/625MOV可实现的各种传送:寄存器与寄存器之间的传送:MOVAL,CL

寄存器与段寄存器之间的传送:MOVDS,AX

寄存器与存储器之间的传送:

MOV[3000H],AX

立即数到寄存器的传送:MOVAL,20H

立即数到存储器的传送:

MOVBYTEPTR[BP+SI],20H

存储器与段寄存器之间的传送:

MOVDS,[2000H]2023/12/626使用MOV指令完成数据传送时需注意几点:

MOV指令的两个操作数的类型必须相同

MOVAX,DL

╳不能用一条MOV指令完成两个存储器单元之间的数据传送

MOV[BX],[SI]

╳不能用立即数直接给段寄存器赋值

MOVDS,DATA

╳不能在段寄存器之间进行直接数据传送

MOVDS,ES

╳通常不要求用户用MOV指令修改代码段寄存器CS和指令指针寄存器IP的内容,但CS可以作为源操作数2023/12/627

⑵堆栈操作指令PUSH和POP(Pushwordontostack,Popwordoffstack)堆栈是内存中一个特定的区域,用以存放寄存器或存储器中暂时不用但又必须保存的数据。

2023/12/628堆栈操作需要遵循以下原则:

堆栈的存取每次必须是一个字(16位);向堆栈中存放数据时,总是从高地址向低地址方向增长,从堆栈取数据时正好相反;堆栈指令中的操作数只能是寄存器或存储器操作数,而不能是立即数;堆栈段在内存中的位置由SS决定,堆栈指针SP总是指向栈顶,即SP的内容等于当前栈顶的偏移地址。在压入操作数之前,SP先减2。每弹出一个字,SP加2;对堆栈的操作遵循“后进先出(LIFO:LastInFirstOut)”的原则。最后压人堆栈的数据会最先被弹出。2023/12/629堆栈示意图

2023/12/630堆栈操作指令PUSH,POPPUSHsrc;src的高8位→[(SP)-1];src的低8位→[(SP)-2];(SP)-2→(SP)POPdest;[SP]→dest的低8位;[SP+1]→dest的高8位;(SP)+2→(SP)2023/12/631

指令中,操作数src和dest可以是以下三种类型:寄存器(包括数据寄存器、地址寄存器和变址寄存器);段寄存器(CS除外。PUSHCS指令是合法的;而POPCS是非法的);存储器单元2023/12/632PUSHAX指令执行示意图

2023/12/633POPAX指令执行示意图

2023/12/634交换指令XCHG(Exchange)

指令格式及操作:

XCHGdest,src;(dest)←→(src)源操作数和目标操作数均可以是寄存器或存储器,但不能同时为存储器。即可以在寄存器与寄存器之间、寄存器与存储器之间进行交换,但不能在存储器与存储器之间进行交换。不能为段寄存器操作数。即段寄存器的内容不能参加交换。两个操作数的字长必须相同,可以是字节交换,也可以是字交换。2023/12/635查表转移指令XLAT(Translate)

指令格式与操作:

XLAT;(AL)←[(BX)+(AL)]

或:XLATsrc_table(src_table表示要查找的表的首地址)可以根据表中元素的序号查出表中相应元素的内容应预先将要查找的这类代码排成一个表存放在内存的某个区域中。将表的首地址(偏移地址)送BX寄存器,要查找的元素的序号送AL,表中第一个元素的序号为0,然后依次为1,2,3,…。执行XLAT指令后,标中指定序号的元素存于AL2023/12/636例:现要查出数值6对应的ASCII码

LEABX,Hex_table;(BX)←表的首地址

MOVAL,6;(AL)←6XLAT;查表转换结果为(AL)=36H,为6所对应的ASCII码。

2023/12/637字位扩展指令

操作数扩展的规则是:扩展时在高位添加符号位,即将符号位扩展到整个高8位(或高16位)。例如,要把有符号数35H扩展为一个字,则结果为0035H;而如果要扩展的数是81H,则结果为FF81H。2023/12/638CBW(ConvertBytetoWord)

CBW;若(AL)<80H,则(AH)=00H;否则(AH)=FFH。CBW将一个字节的数(8位)扩展为一个字长的数(16位)。指令中隐含了操作数AL和AH。CBW指令不影响标志位。例如,把字节9AH扩展为字的语句如下:

MOVAL,9AHCBW其结果为:(AX)=FF9AH。2023/12/639CWD(ConvertWordtoDoubleword)

CWD;若(AX)<8000H,则(DX)=0000H;否则(DX)=FFFFH。CWD将一个字操作数(16位)扩展为一个双字(32位)。指令中隐含了操作数AX和DX,扩展后的高16位放在DX中。CWD指令也不影响标志位。例如,把字25ABH扩展为双字的语句如下:

MOVAX,25ABHCWD其结果为:(DX:AX)=000025ABH2023/12/640输入输出指令(InputandOutput)

输入指令IN用于从外设端口接收数据,输出指令OUT向外设端口发送数据。无论接收到的数据或准备发送的数据,都必须在累加器AX(字)或AL(字节)中直接寻址方式:当I/O端口地址为8位二进制时,在指令中直接给出此端口地址。它允许寻址256个端口,端口地址为0~FFH。DX寄存器间接寻址方式:当I/O端口地址为16位二进制时,用DX寄存器间接寻址。它可寻址64K个端口,端口地址为0~FFFFH。

2023/12/641

输入指令IN(Inputbyteorword)

INacc,port

;port为8位立即数表示的端口地址,直接寻址或INacc,DX;DX给出16位端口地址,间接寻址输出指令OUT(Outputbyteorword)OUTport,acc

;port为8位立即数表示的端口地址,直接寻址或OUTDX,acc;DX给出16位端口地址,间接寻址2023/12/642[例]将一个字节3BH输出到端口地址78A0H

MOVAL,3BH

;将要输出的字节送入累加器ALMOVDX,78A0H

;将16位端口地址送入DX进行间址OUTDX,AL

;将AL中的一个字节输出到DX所指定的16位端口地址2023/12/643目标地址传送指令(Address-ObjectTransfer)

取偏移地址指令LEA(LoadEffectiveAddress)

LEAreg16,mem指令指令中的源操作数必须为存储器操作数,目标操作数必须为16位通用寄存器,指令的执行结果是把源操作数的有效地址(即16位偏移地址)送到目标寄存器。例如:LEABX,BUFFER2023/12/644

注意LEA指令和MOV指令的区别:

LEABX,BUFFERMOVBX,BUFFER以下两条指令的效果相同:

LEABX,BUFFERMOVBX,OFFSETBUFFER2023/12/645

LDS(LoadpointerusingDS)

LDSreg16,mem32;(reg16)←((mem32)+1:(mem32));(DS)←((mem32)+3:(mem32)+2)指令中源操作数mem32为存储器操作数,目标操作数为16位通用寄存器。LDS指令把存储器mem32中存放的一个32位远地址指针(包括偏移地址和段地址)送到reg16和DS。四个存储单元的前两个单元的内容作为偏移地址送到reg16,后两个单元的内容作为段地址送到段寄存器DS。2023/12/646例设(DS)=6000,内存地址为60348H开始的4个单元中存放了一个32位的远地址指针98011H。

LDSSI,[0348H] MOVAX,[SI]上述第一条指令执行后的结果为:(SI)=8011H,(DS)=9000H。第二条指令的执行结果为:(AX)=3412H2023/12/647

LES(LoadpointerusingES)LES指令的格式及功能与LDS相似,两个高地址单元中给出的段地址送ES。2023/12/648标志传送指令(FlagRegisterTransfer)

LAHF(LoadAHfromFlags)该指令将标志寄存器FLAGS中的五个标志位,即符号标志SF、零标志ZF、辅助进位标志AF、奇偶标志PF以及进位标志CF分别传送到累加器AH的对应位。LAHF指令不影响标志位。

2023/12/649

SAHF(StoreAHintoFlags)SAHF指令的传送方向与LAHF相反,将AH寄存器的第7、6、4、2、0位分别传送到标志寄存器的对应位。SAHF指令影响标志位,FLAGS寄存器中的SF、ZF、AF、PF和CF将被修改成AH寄存器对应位的状态,但其余标志位不受影响。2023/12/650

PUSHF(PushFlagsontostack)PUSHF指令是将标志寄存器FLAGS压入堆栈。指令本身不影响标志位。[SP-1]←(FLAGSH)[SP-2]←(FLAGSL)(SP)←(SP)-2POPF(PopFlagsoffstack)POPF指令将堆栈中当前栈顶的两个单元的内容弹出到标志寄存器FLAGS中。POPF指令影响标志位(FLAGSL)←[SP](FLAGSH)←[SP+1](SP)←(SP)+22023/12/651算术运算指令

8086/8088提供了加、减、乘、除4组基本的算术运算指令,既可以用于字节运算,也可以用于字运算;既可用于无符号数运算,也可用于带符号数运算。若是带符号数,用补码表示。8086/8088还提供了各类校正操作指令,可以进行十进制的算术运算。

2023/12/652加法运算指令

不带进位的加法指令ADD带进位的加法指令ADC加1指令INC两条加法调整指令:AAA和DAA。2023/12/653不带进位的加法指令ADD(Addition)

ADDOPRD1,OPRD2;(OPRD1)←(OPRD1)+(OPRD2)ADD加法指令影响标志位源操作数和目标操作数可以是寄存器操作数或存储器操作数,源操作数还可以是立即数;操作数可以是无符号数,也可以是带符号数。需注意两点:一是源操作数与目标操作数不能同时为存储器操作数,二是不能对段寄存器进行运算2023/12/654带进位的加法指令ADC(Addwithcarry)

ADCOPRD1,OPRD2;(OPRD1)←(OPRD1)+(OPRD2)+(CF)ADC指令与ADD指令在格式、功能及对标志位的影响等方面都类似,只是在ADC指令中,CF也要参加求和运算ADC指令主要用于多字节数据的加法运算。如果低字节相加时产生进位,则在下一次高字节相加时应将此进位加进去2023/12/655加1指令INC(Incrementby1)

INCOPRD;(OPRD)←(OPRD)+1INC指令对指定的操作数加1,再送回到该操作数。在指令中,操作数OPRD可以是寄存器操作数,也可以是存储器操作数;可以是8位,也可以是16位。但不能是段寄存器,也不能是立即数INC指令不影响CF标志位,但会影响其他5个状态标志位AF、OF、PF、SF和ZF。INC指令通常用在循环程序中修改地址指针及循环次数等2023/12/656压缩BCD加法的十进制调整指令DAA

(DecimalAdjustforAddition)

所谓压缩的BCD码,是指一个字节中可以存放两位BCD码,高4位和低4位各存放一位。一般来说,两个BCD码相加以后,有可能得到不正确的BCD结果,可用DAA指令对AL寄存器中的“和”进行调整,即可得到预期的结果。DAA指令调整的方法是:①若(AL)中低4位>9或AF=1,则(AL)+06H→(AL),并使AF=1;②若(AL)中高4位>9或CF=1,则(AL)+60H→(AL),并使CF=1。2023/12/657[例]编程用BCD数计算46+35=?MOVAL,46H;(AL)=46HADDAL,35H;(AL)=7BHDAA;(AL)=81H2023/12/658

非压缩BCD加法的十进制调整指令AAA

(unpackedBCD[ASCII]AdjustforAddition)

所谓非压缩的BCD码,就是一个字节存放一位BCD码(BCD码存放在字节的低4位,高4位为零)。调整以前,先用指令ADD或ADC进行8位数的加法运算,相加结果放在AL中,用AAA指令调整后,非压缩BCD码的低位在AL寄存器,高位在AH寄存器。AAA指令的调整步骤为:①若(AL)中低4位>9或AF=1,则(AL)+6,(AH)+1,并使AF=1;②屏蔽掉(AL)中高4位,即(AL)←(AL)∧0FH;③CF←AF2023/12/659[例]用BCD码计算8+6=?

MOVAL,08H;BCD码数8

MOVBL,06H;BCD码数6

ADDAL,BL;(AL)=08H+06H=0EHAAA;(AL)=0EH+06H=04H(高4位清零);(AH)=1;(CF)=12023/12/660减法运算指令

不带进位减法指令SUB带进位减法指令SBB减1指令DEC求补指令NEG比较指令CMP减法的ASCII调整指令AAS减法十进制调整指令DAS

2023/12/661

不带进位减法指令SUB(Subtraction)

SUBOPRD1,OPRD2;(OPRD1)←(OPRD1)-(OPRD2)带进位减法指令SBB(SubtractionwithBorrow)

SBBOPRD1,OPRD2;(OPRD1)←(OPRD1)-(OPRD2)-CF减1指令DEC(Decrementby1)

DECOPRD;(OPRD)←(OPRD)-12023/12/662

DEC指令常用在循环程序中修改循环次数。例如:

MOVCX,1000HNEXT:DECCX

JNZNEXTHLT2023/12/663

求补指令NEG(Negate)

NEGOPRD;(OPRD)←0-(OPRD)

求补指令对6个操作数均有影响。操作数的类型可以是寄存器或存储器;可以对8位或16位数求补利用NEG指令可以得到负数的绝对值2023/12/664

比较指令CMP(Compare)

CMPOPRD1,OPRD2;(OPRD1)-(OPRD2),结果不送回OPRD1比较指令对6个状态标志位SF、ZF、AF、PF、CF和OF都有影响。比较指令主要用来比较两个数的大小关系

2023/12/665

压缩BCD减法的十进制调整DAS(DecimalAdjustforSubtraction)非压缩BCD减法的十进制调整AAS(unpackedBCD[ASCII]adjustforsubtraction)2023/12/666乘法运算指令无符号数乘法指令MUL有符号数乘法指令IMUL乘法的十进制调整指令AAM

2023/12/667

无符号数乘法指令MUL(Multiplicationunsigned)

MULOPRD指令的操作为:字节乘法:(AX)←(OPRD)×(AL)字乘法:(DX:AX)←(OPRD)×(AX)

源操作数OPRD可以是8位或16位的寄存器或存储器。另一个操作数隐含在累加器中(8位乘法时在AL中;16位乘法时在AX中)。两个操作数均按无符号数处理,其取值范围为0~255(字节),或0~65535(字)。乘法指令要求两个操作数必须等长,且不能是立即数2023/12/668

有符号数乘法指令IMUL(IntegerMultiplication)操作数应满足带符号数的取值范围,即-128~+127(字节)和-32768~+32767(字)乘法的十进制调整指令AAM(unpackedBCD[ASCII]adjustformultiply)

2023/12/669除法运算指令

无符号数除法指令DIV带符号数除法指令IDIV除法的十进制调整指令AAD

2023/12/670

无符号数除法指令DIV(Divisionunsigned)

DIVOPRD指令中的操作数OPRD(除数)可以是8位或16位的寄存器操作数或存储器操作数。指令隐含被除数AX(16位)或DX:AX(32位)。字节除法:(AL)←(AX)/(OPRD)(AH)←(AX)%(OPRD)(%为取余数操作)字除法:(AX)←(DX:AX)/(OPRD)(DX)←(DX:AX)%(OPRD)(%为取余数操作)2023/12/671

带符号数除法指令IDIV(IntegerDivision)IDIV指令在格式和功能上都与DIV指令类似,只是要求操作数为有符号数除法的十进制调整指令AAD(unpackedBCD[ASCII]adjustfordivision)2023/12/672逻辑运算和移位指令

逻辑运算指令AND(逻辑“与”)OR(逻辑“或”)NOT(逻辑“非”)XOR(逻辑“异或”)TEST(测试)这些指令可对8位或16位的寄存器或存储器单元中的内容进行按位操作2023/12/673

逻辑“与”指令AND(Logicaland)

ANDOPRD1,OPRD2;(OPRD1)←(OPRD1)∧(OPRD2)AND指令的主要用途是将目标操作数的某些位清零,而其他位保持不变如果一个寄存器的内容与该寄存器本身相与(例如:ANDAX,AX),则寄存器原来的内容不会改变,但将影响标志位SF、ZF和PF,并使CF=OF=02023/12/674

逻辑“或”指令OR(Logicalinclusiveor)

OROPRD1,OPRD2;(OPRD1)←(OPRD1)∨(OPRD2)OR指令的主要用途是将目标操作数的某些位置1,而其他位保持不变2023/12/675

逻辑“非”指令NOT(Logicalnot)

NOTOPRDNOT指令将指定的操作数OPRD按位求反,再送回到该操作数

逻辑“异或”指令XOR(Logicalnot)

XOROPRD1,OPRD2;(OPRD1)←(OPRD1)⊕(OPRD2)

XOR指令的一个用途是将寄存器清零,同时也将进位标志位CF清零。例如:XORAX,AX

2023/12/676

测试指令TEST(Testornon-destructivelogicaland)TEST指令的格式、操作及对操作数的要求和AND指令类似,但该指令“与”的结果不送回目标操作数,而只是影响标志位。TEST指令常用于在不破坏原来操作数的情况下检测操作数中某些位是“1”还是“0”。例如:TESTAL,80HTESTAX,4000H2023/12/677非循环移位指令

算术左移指令SAL(Shiftarithmeticleft)算术右移指令SAR(Shiftarithmeticright)逻辑左移指令SHL(Shiftlogicleft)逻辑右移指令SHR(Shiftlogicright)可以实现对8位或16位的寄存器或存储器操作数进行指定次数的移位。在要求进行2位或更多位的移动时,移位的次数必须放在CL寄存器中。2023/12/678

算术左移和逻辑左移指令SAL/SHL

算术左移指令SAL和逻辑左移指令SHL执行完全相同的操作:

SALOPRD,1SHLOPRD,1或SALOPRD,CLSHLOPRD,CLSAL指令和SHL指令的区别是:SAL指令将操作数视为有符号数,而SHL将操作数视为无符号数

2023/12/679[例3-8]一个16位无符号数存放在以DATA为首地址的两个连续的单元,用左移指令实现将该数乘以乘以10。

LEASI,DATA;DATA单元的偏移地址送SIMOVAX,[SI];(AX)←被乘数

SHLAX,1;(AX)←DATA*2MOVBX,AX;暂存于BXMOVCL,2;(CL)←移位次数

SHLAX,CL;(AX)←DATA*8ADDAX,BX;(AX)←DATA*10HLT;停止2023/12/680

逻辑右移指令SHR将目标操作数顺序向右移1位或CL指定的位数

例:SHRBH,1

SHRAX,CL算术右移指令SAR

将目标操作数顺序向右移1位或CL指定的位数例:SARAL,1SARBX,CL2023/12/681循环移位指令

不带进位标志位CF的循环左移指令ROL(Rotateleft)不带进位标志位CF的循环右移指令ROR(Rotateright)带进位标志位CF的循环左移指令RCL(Rotateleftthroughcarry)带进位标志位CF的循环右移指令RCR(Rotaterightthroughcarry)所有循环移位指令都只影响进位标志CF和溢出标志OF,而对其他标志位没有影响2023/12/682

不带进位标志位CF的循环左移指令ROL

ROLOPRD,1或ROLOPRD,CL

不带进位标志位CF的循环右移指令ROR

ROROPRD,1或ROROPRD,CL

2023/12/683

带进位标志位CF的循环左移指令RCL

RCLOPRD,1或RCLOPRD,CL

带进位标志位CF的循环右移指令RCR

RCROPRD,1或RCROPRD,CL

2023/12/684串操作指令

串操作指令具有以下的共同特点:⑴源串指针为DS:SI。源串(源操作数)默认为数据段,即段基地址在DS中,但允许超越。偏移地址用SI寄存器指定。⑵目标串指针为ES:DI。目标串(目标操作数)默认在ES附加段中,不允许段超越。偏移地址用DI寄存器指定。⑶使用重复前缀时,要操作的串长度放在CX寄存器中。⑷自动修改指针和计数器。在对每个字节(或字)操作后,SI和DI寄存器的内容会根据方向标志DF的情况自动修改:若(DF)=0,则每次操作后,SI和DI按地址增量方向修改(对字节操作加1;对字操作加2);若(DF)=1,则SI和DI按地址减量方向修改。若使用了重复前缀,CX的内容也会每次自动减1。2023/12/685

用于串操作的重复前缀:REP:无条件重复前缀-重复执行指令规定的操作,直到(CX)=0;REPE:相等时重复-ZF=1,且(CX)≠0时重复;REPZ:结果为零时重复-ZF=1,且(CX)≠0时重复;REPNE:不相等时重复-ZF=0,且(CX)≠0时重复;REPNZ:结果不为零时重复-ZF=0,且(CX)≠0时重复

2023/12/686

串传送指令MOVS(Movestring)指令格式有3种:

MOVSOPRD1,OPRD2MOVSBMOVSW第二种和第三种格式隐含了两个操作数的地址,此时源串和目标串地址必须符合默认值,即源串在DS段,偏移地址在SI中,而目标串在ES段,偏移地址在DI中

2023/12/687[例]将3000H:1500H地址开始的100个字节传送到6000H:1000H开始的内存单元中去

MOVAX,3000HMOVDS,AX;设定源串段地址MOVAX,6000HMOVES,AX;设定目标串段地址MOVSI,1500H;设定源串偏移地址MOVDI,1000H;设定目标串偏移地址MOVCX,100;串长度送CXCLD;(DF)=0,使地址指针按增量方向修改NEXT:REPMOVSB

2023/12/688

串比较指令CMPS(Comparestring)指令有3种格式:

CMPSOPRD1,OPRD2CMPSBCMPSW串比较指令通常和条件重复前缀REPE(REPZ)或REPNE(REPNZ)连用,用来检查两个字符串是否相等。2023/12/689[例3-10]现有两个长度均为100个字节的字符串,STRING1为源串首地址,STRING2为目标串首地址。试比较两个字符串是否相同,并找出其中第一个不相等的字符,将源串中该字符的地址送BX,该字符送AL。

LEASI,STRING1;(SI)←源串首地址

LEADI,STRING2;(DI)←目标串首地址

MOVCX,100;(CX)←串长度

CLD;(DF)=0,使地址指针按增量方向修改

REPECMPSB;若相等则重复比较

JCXZSTOP;若(CX)=0,则转STOPDECSI;否则(SI)-1,指向不相等的单元MOVBX,SI;(BX)←不相等单元的地址MOVAL,[SI];(AL)←不相等单元的内容STOP:HLT;停止2023/12/690

串扫描指令SCAS(Scanstring)指令格式有3种:

SCASOPRD;OPRD为目的串

SCASBSCASWSCAS指令执行时,将累加器AL或AX的值与目的串(由ES:DI所指向)中的字节或字进行比较,比较结果不改变目的操作数,只影响标志位

SCAS指令常用于在一个字符串中搜索特定的关键字,把要找的关键字放在AL(或AX)中,再用本指令与字符串中各字符逐一进行比较2023/12/691[例3-11]有一个包含100个字符的字符串,其首地址为STRING。找出字符串中第一个回车符CR(其ASCII码为ODH),找到后将其地址保存在BX

LEADI,STRING;(DI)←字符串首地址

MOVAL,0DH;(AL)←回车符CRMOVCX,100;(CX)←字符串长度

CLD ;清标志位DFREPNESCASB;若未找到,重复扫描

JZ FOUND;若找到,则转FOUND JMPSTOP;转移至STOPFOUND:DECDI;(DI)-1 MOVBX,DI;地址送到BXSTOP:HLT;停止2023/12/692

串装入指令LODS(Loadstring)指令格式有3种:

LODSOPRD;OPRD为源串

LODSB LODSWLODS指令把由DS:SI指向的源串中的字节或字取到累加器AL或AX中,并在这之后根据DF的值自动修改指针SI,以指向下一个要装入的字节或字。

2023/12/693

[例3-12]在以BUFFER为首地址的内存区域中,有10个以非压缩BCD码形式存放的十进制数,它们的值可能是0~9中的任意一个。将这些十进制数顺序显示在屏幕上。在屏幕上显示一个字符的方法,是使用DOS系统功能调用,这样只需要三条语句即可:①02H→AH;②待显示字符的ASCII码→DL;③INT21H。2023/12/694

LEASI,BUFFER;(SI)←源串首地址

MOV CX,10;(CX)←字符串长度

CLD;清标志位DF MOVAH,02H;(AH)←功能号NEXT:LODSB;取一个BCD码到AL ADDAL,30H;BCD码转换为ASCII码

MOVDL,AL;(DL)←待显示字符的ASCII码

INT21H;显示

DECCX;(CX)←(CX)-1 JNZNEXT;(CX)≠0则重复

HLT;停止2023/12/695

串存储指令STOS(Storestring)指令格式有3种:

STOSOPRD;OPRD为目标串

STOSBSTOSWSTOS指令把累加器AL中的字节或AX中的字存到由ES:DI指向的存储器单元中,并在这之后根据DF的值自动修改指针DI的值(增量或减量),以指向下一个存储单元。利用重复前缀REP,可对连续的存储单元存入相同的值

2023/12/696[例]将5000H:0800H单元开始的100个字节中装入初始值FFH

MOVAX,5000H MOVES,AX

MOVDI,0800H

MOVCX,50

CLD

MOVAX,0FFFFHREPSTOSW2023/12/697控制转移指令

无条件转移指令JMP(Jump)JMP指令的操作是无条件地将程序转移到指定的目标地址,并从该地址开始执行新的程序段。目标地址可以用直接方式或间接方式给出。JMP指令不影响标志位⑴段内直接转移JMPLABLE

;(IP)←(IP)+disp,disp为8位或16位的相对位移量。

指令中的LABLE是一个标号,也称符号地址,它表示转移的目的地。该标号与本程序在同一个代码段内。

2023/12/698

⑵段内间接转移指令格式:

JMPOPRD;(IP)←(OPRD)指令中的操作数OPRD是16位的寄存器或者存储器地址。可以采用各种寻址方式。指令的操作是用指定的16位寄存器或存储器两单元的内容作为目标的偏移地址,来取代原来IP的内容,从而实现程序的转移。代码段寄存器CS的值不变。

例:JMPSI;(IP)←(SI)JMPWORDPTR[BX+SI]

;(IP)←(BX+SI)所指向的连续两个存储单元的内容2023/12/699

⑶段间直接转移JMPFARLABLE;(IP)←OFFSETLABLE;(CS)←SEGLABLE指令的操作数是一个远标号,该标号在另一个代码段内

⑷段间间接转移

JMPmem32;(IP)←(mem32);(CS)←(mem32+2)指令的操作数是一个32位的存储器地址(不能是寄存器)。指令的操作是将存储器的前两个字节送到IP寄存器,存储器的后两个字节送到CS寄存器,以实现到另一个代码段的转移。

2023/12/6100条件转移指令Jcc

条件转移指令Jcc

Jccshort_lable指令助记符中的“cc”表示条件。Short_lable为短转移。条件转移指令是根据前一条指令执行后标志位的状态,来决定程序是否转移。若满足转移指令规定的条件,则程序转移到指令指定的地址去执行;若不满足条件,则顺序执行下一条指令。所有的条件转移都是直接寻址方式的短转移,即只能在以当前指令为中心的-128~+127范围内转移。条件转移指令不影响标志位

2023/12/6101

条件转移指令

指令名称助记符转移条件

进位转移JC(CF)=1无进位转移JNC(CF)=0等于/零转移JE/JZ(ZF)=1不等于/非零转移JNE/JNZ(ZF)=0负转移JS(SF)=1正转移JNS(SF)=0溢出转移JO(OF)=1不溢出转移JNO(OF)=0偶转移JP/JPE(PF)=1奇转移JNP/JPO(PF)=02023/12/6102

低于

温馨提示

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

评论

0/150

提交评论