CH3-8086指令系统-陈裕国_第1页
CH3-8086指令系统-陈裕国_第2页
CH3-8086指令系统-陈裕国_第3页
CH3-8086指令系统-陈裕国_第4页
CH3-8086指令系统-陈裕国_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

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

文档简介

第3章

8086指令系统

3.1概述3.2寻址方式 3.38086指令系统

练习题、作业题3.1概述

一、指令与指令系统指令:控制计算机完成某种操作的命令指令系统:处理器所能识别的所有指令的集合指令的兼容性:同一系列机的指令都是兼容的。接下页二、指令格式指令中应包含的信息:运算数据的来源运算结果的去向执行的操作接下页指令格式操作码[操作数],[操作数]执行何种操作目标操作数源操作数参加操作的数据或数据存放的地址接下页指令格式:

零操作数指令:操作码单操作数指令:操作码操作数双操作数指令:操作码操作数,操作数多操作数指令:三操作数及以上接下页三、指令中的操作数立即数寄存器存储器表征参加操作的数据本身表征数据存放的地址接下页立即数操作数立即数只能作为源操作数。其本身是参加操作的数据,可以是8位或16位。例:MOVAX,1234HMOVBL,22H立即数无法作为目标操作数立即数可以是无符号或带符号数,其数值应在可取值范围内。接下页寄存器操作数:参加运算的数存放在指令给出的寄存器中,可以是16位或8位。例:MOVAX,BXMOVDL,CH接下页存储器操作数参加运算的数存放在存储器的某一个或某两个单元中表现形式:[]立即数或寄存器接下页存储器操作数例例:MOVAX,[1200H]MOVAL,[1200H]22H11H1200H偏移地址AHAL┇

接下页四、指令字长与机器字长指令字长:由操作码的长度、操作数地址长度、操作数个数决定;机器字长:计算机能够直接处理的二进制数的位数。接下页五、指令的执行速度指令的字长影响指令的执行速度(常用指令的执行时间见表3-4)对不同的操作数,指令执行的时间不同:

存储器快!立即数寄存器接下页六、CISC和RISC指令系统CISC指令系统指令的功能强,种类多,高级语言和机器语言间的距离缩小;指令系统复杂,难使用。RISC指令系统指令功能较弱,种类少,格式简单;多数指令在一个计算机周期内完成;对存储器的结构和存取速度要求较高。返回一、指令格式二、寻址方式立即寻址寄存器寻址内存寻址例题3.2寻址方式返回一条指令通常包括两部分:操作码和操作数。格式:(1)操作码指定CPU执行哪一种操作,如传送、运算等;(2)操作数为参与操作的数据,如寄存器中的数据或内存单元中的数据等。一、指令格式返回操作码操作数

指令中用于说明操作数所在地址的方法称为寻址方式(AddressingMode)。

二、寻址方式返回

当操作数就在指令中时,称为立即(数)寻址;这种操作数称为立即数,8位或16位。操作数直接在指令中,紧跟在操作码后,作为指令的一部分放在码段中。如图

例:MOVAX,2058H

说明:这条指令的功能就是将立即数2058H传送到寄存器AX中。执行完该条指令后,(AX)=2058H(或表示成AX=2058H);

立即寻址接下页立即寻址返回

当操作数在寄存器中时为寄存器寻址(或称寄存器直接寻址)。如①MOVAL,12H说明:目的操作数AL即为寄存器寻址;②MOVAL,AH

说明:这条指令的功能就是将寄存器AH的内容传送到寄存器AL中。执行完该条指令后,AL的内容和AH的内容一样(或AL=AH);寄存器寻址返回

当操作数在内存中时为内存寻址,称其为内存操作数。一条指令中只允许有一个内存操作数!

内存寻址时,指令中给出的是操作数的有效地址EA或产生EA的计算方式。而EA即是逻辑地址中的偏移地址。对BX、SI、DI默认在DS段中;对BP默认在SS段中。①直接寻址②寄存器间接寻址③基址/变址相对寻址④基址变址寻址⑤基址变址相对寻址内存寻址返回EA由指令中直接给出的16位位移量单独构成时称为内存储寻址中的直接寻址。16位偏移量应带有方括号。如:①MOVAX,[3100H]

说明:根据指令EA=3100H,段地址即取当前数据段DS(设DS=6000H),20位物理地址=DS×10H+3100H=63100H,该指令的功能就是将内存单元(63100H)的字内容3050H传送到寄存器AX中,当执行该指令后,AX=3050HH①直接寻址返回

EA的内容由寄存器内容给出,称为内存寻址中的寄存器间接寻址。寄存器应带有方括号。如:①MOVAL,[BX]②MOVAX,[SI]③MOVAX,[DI]例:MOVBX,[DI]其中(DS)=6000H,(DI)=2000H,(62000H)=50A0H指令执行后:(BX)=50A0H

②寄存器间接寻址返回EA由指令中给出的基址寄存器/变址寄存器和位移量组成。

例:MOVAX,COUNT[BP]

MOVAX,[COUNT+BP]或

MOVAX,COUNT+[BP]

COUNT为16位位移量。指令执行前:(SS)=5000H, (BP)=3000H, COUNT=2040H, (AX)=1234H指令执行后:EA=5040H PA=55040H (55040H)=5548H (AX)=5548H③基址/变址相对寻址返回

EA由基址寄存器和变址寄存器组成。如:MOVAL,[BX+SI]或MOVAL,[BX][SI]则,EA=BX+SIPA=10H×(DS)+BX+SIMOVAL,[BP+SI]或MOVAL,[BP][SI]则,EA=BP+SI

PA=10H×(SS)+BP+SI④基址变址寻址返回

由基址寄存器、变址寄存器和位移量组成。如MOVAX,MASK[BX][DI]MOVAX,MASK[BX+DI]MOVAX,[MASX+BX+DI]执行指令前:(DS)=3000H(BX)=1346H(DI)=0500HMASK=1234H(32A7AH)=4050H执行指令后:EA=2A7AHPA=32A7AH(AX)=4050H⑤基址变址相对寻址返回1、指出各指令中源操作数和目的操作数的寻址方式,并说明操作数的类型(字节或字数据)。(1)MOVAX,[BX](2)MOVAX,[BX+DI+0004H]答:(1)源操作数是内存寻址中的寄存器间接寻址,EA=BX;目的操作数是寄存器寻址;传送的是字数据。(2)源操作数是内存寻址中的相对基址变址寻址,EA=BX+DI+0004H;目的操作数是寄存器寻址;传送的是字数据。例题返回一、数据传送类指令二、算术运算指令三、逻辑运算指令四、移位指令五、串操作指令六、控制转移指令七、处理器控制指令3.38086指令系统返回通用数据传送指令地址传送指令状态标志传送指令一、数据传送类指令返回(1)MOV指令(注意点)(2)PUSH和POP指令(3)XCHG指令通用数据传送指令返回

是基本传送类指令,实现字或字节数据的复制。用来实现:寄←→寄、CPU←→存储器、PU←→I/O之间的数据传送。这是一种最基本最重要的操作。指令格式:MOVdst,src指令功能:将源操作数src,传送到目的操作数dst中。如:MOV

AL,12H功能:执行指令就是将立即数12H传送到AL中,执行完指令后AL=12H。MOV指令接下页

MOV传送类指令可以实现六种形式的传送:①立即数送寄存器;如:MOVBX,1122H;BX=1122H②立即数送存储单元;如:MOV[BX],1122H;将1122H送到EA=BX的内存单元中MOV指令接下页③通用寄存器之间的传送;如:MOVBX,AX;BX=AX

MOVAL,AH;AL=AH④通用寄存器和段寄存器之间的传送;如:MOVDS,AX;DS=AX

MOVAX,ES;AX=ESMOV指令接下页⑤通用寄存器和存储单元之间的传送;如:MOVAL,[BX];将EA=BX的内存单元的内容送AL

MOV[1400H],BX;将BX的内容送EA=1400的内存单元⑥段寄存器和存储单元之间的传送。如:MOV[1400H],CS;

MOVDS,[BX];MOV指令返回(1)两个操作数的类型必须一致;MOV AL,AH正确MOV AL,AX错误(2)两个操作数不能同时都是存储器操作数

MOV [BX],[BX+100H]错误

(3)不能用CS做目的操作数; MOV AX,CS正确MOV CS,AX错误MOV指令注意点接下页(4)不允许用立即数做目的操作数;

MOV 1000H,AX错误(5)不允许用立即数直接向段寄存器传送数据; MOV DS,5000H错误

MOVAX,5000H正确MOV DS,AX(6)不允许在段寄存器之间直接传送数据;

MOV DS,CS错误

传送指令不影响标志位!MOV指令注意点返回

用来保存数据和地址的一个存储区,称为堆栈区。堆栈区的段地址用SS表示,堆栈栈顶指针是SP(隐含),SP的初值规定了堆栈区的大小。数据有进栈/出栈,栈顶位置会发生变化,堆栈指针SP随数据进栈/出栈发生变化,堆栈操作的“进栈”、“出栈”按先入后出的方式工作。①入栈指令PUSH②出栈指令POP不影响标志位!

注意点PUSH和POP指令(堆栈操作指令)返回

指令格式:PUSHsrc功能:SP-2→SP(隐含操作);将字数据src送到EA=SP的堆栈段内;例:PUSHAX设AX=1020HPUSH指令(进栈操作指令)接下页

PUSH指令(进栈操作指令)返回

指令格式:POPdst功能:将EA=SP的字送到目的操作dst中。

SP+2→SP例:POPBXPOP指令(出栈操作指令)接下页

POP指令(出栈操作指令)返回

堆栈指令使用时应注意两点:

①堆栈操作总是按字进行

②不能从栈顶弹出一个字给CS堆栈操作指令注意点返回

指令格式:XCHGdst,src指令功能:dstsrc

如:XCHGAX,BXXCHGCL,[BX+DI]不影响标志位!XCHG指令返回

地址传送指令主要用来将地址指针装入有关寄存器。(1)装入有效地址指令(2)装入数据段寄存器指令(3)装入附加段寄存器地址传送指令返回

这条指令用来将源操作数(内存)的有效地址EA装入通用寄存器。不影响标志位。格式:LEAdst,src功能:EASRC→dst(通用寄存器)如:①LEAAX,[1000H]执行指令后,AX=1000H。②LEAAX,[BX]执行指令后,AX=BX。注意区别:MOVAX,[BX]装入有效地址指令返回

这条指令用来将内存中的双字数据(4个字节)装入通用寄存器和数据段寄存器DS。

格式:LDSdst,src功能:src给出的是有效地址,低字送dst,高字送DS。例:设DS=1000H,(11500H)=2345H,(11502H)=ABCDH执行指令LDSSI,[1500H],SI=?DS=?答:SI=2345H,DS=ABCDH装入数据段寄存器指令返回

这条指令用来将内存中的双字数据装入通用寄存器和附加段寄存器。格式:LESdst,src功能:src给出的是有效地址,低字送dst,高字送ES。装入附加段寄存器返回(1)LAHF、SAHF指令(2)PUSHF、POPF指令状态标志传送指令返回指令格式及操作:

LAHF

;FLAGS中的5个标志位传送给AH的对应位。

SAHF

;动作方向与LAHF的动作方向相反。LAHF指令操作示意图LAHF、SAHF指令返回

格式:PUSHF

功能:SP-2→SP;标志寄存器的值入栈;格式:POPF

功能:先将EA=SP所指内存的字送标志寄存器;SP+2→SP

不影响标志位。

PUSHF和POPF指令用于保护和恢复标志寄存器内容PUSHF、POPF指令返回加法运算指令减法运算指令乘法运算指令除法运算指令

二、算术运算指令返回(1)加法指令ADD(2)带进位加法指令ADC(3)加1指令INC(4)压缩的BCD码加法调整指令DAA(5)非压缩的BCD码加法调整指令AAA加法运算指令返回

指令格式:ADDdst,src指令功能:(dst)+(src)→(dst)

所有标志位随运算结果发生变化。

无符号数和有符号数加法都采用ADD指令.加法指令ADD接下页例:设原AL=79H,BH=0B3H求执行指令ADDAL,BH后,AL=?BH=?各个标志位的值?解:79H=01111001B121+121+)B3H=10110011B+179+(-77)100101100B300+44所以,AL=00101100B=2CH,BH=0B3HSF=0,ZF=0,AF=0,CF=1,OF=0,PF=0.加法指令ADD返回

指令格式:ADCdst,src指令功能:(dst)+(src)+CF→(dst)所有标志位随运算结果变化。如:①ADCAX,BX;AX+BX+CF→AX②ADCAL,[BX];将EA=BX的内存单元的;内容+AL+CF→AL③ADC[BX],AX;将EA=BX的内存内容+AX;+CF→该内存单元带进位加法指令ADC接下页例:求两个双字数据相加.数据1在DX(高字)和AX(低字)内,为12345678H,数据2在BX(高字)和CX(低字)内,为6789ABCDH.解:因为8086/8088的指令只能进行字/字节运算,所以对于双字必须分两步进行.第一步,低字和低字相加:

ADDAX,CXAX=5678H+)CX=ABCDHAX=0245HCF=1带进位加法指令ADC接下页第二步,高字和高字相加,同时考虑低字之和向高字进位:

ADCDX,BXDX=1234HBX=6789H+)CF=1DX=79BEHCF=0所以双字之和是79BE0245H,CF=0带进位加法指令ADC返回

指令格式:INCdst指令功能:(dst)+1→(dst)CF不受影响,其他标志位随运算结果变化。如①INCAX;AX+1→AX②INCCL;CL+1→CL

特例:MOVAX,0FFFFH;AX=FFFFHINCAX;AX=0000H,CF不变加1指令INC返回

指令格式:DAA指令功能:对AL中的压缩BCD数加法结果调整,分两种情况进行.①当AL低4位>9或AF=1时,AL+06H→AL,1→AF;②当AL的高4位>9或CF=1时,AL+60H→AL,1→CF压缩的BCD码加法调整指令DAA接下页已知两个压缩BCD码AL=38H和BL=24H,对其求和.解:第一步ADDAL,BL38BCD=00111000B+)24BCD=00100100B62BCD01011100B(=5CH)

显然,执行加法指令与实际结果不符合压缩的BCD码加法调整指令DAA接下页第二步DAA(注意隐含操作,只对AL)01011100B(=5CH,则低4位>9)+)0110B(=06H)01100010B(=62H即为62BCD)

所以,对于压缩BCD码,在进行加法运算后,必须紧跟一条调整指令DAA.压缩的BCD码加法调整指令DAA返回

指令格式:AAA指令功能:对AL中的两个非压缩BCD码加法结果进行调整.如AL的低4位>9或AF=1,则:①(AL)←(AL)+6,(AH)←(AH)+1,AF←1②(AL)←((AL)∧0FH)③CF←AF否则(AL)←((AL)∧0FH)例:8+9=17MOVAL,08HADDAL,09H;AL=11HAF=1AAA;AL=07HCF=1非压缩的BCD码加法调整指令AAA返回(1)减法指令SUB(2)带借位的减法指令SBB(3)减1指令DEC(4)压缩BCD码减法调整指令DAS(5)非压缩BCD码减法调整指令AAS(6)求补指令NEG(7)比较指令CMP减法运算指令返回

指令格式:SUBdst,src指令功能:(dst)-(src)→(dst)所有标志位随运算结果发生变化。减法指令SUB返回

指令格式:SBBdst,src指令功能:(dst)-(src)-CF→(dst)SBB主要用于多字节减法,CF此处含义表借位。带借位的减法指令SBB返回

指令格式:DECdst指令功能:(dst)-1→(dst)CF不受影响,其他标志位随运算结果变化。例1:MOVAL,8AHDECAL;AL=89H

特例:MOVAL,00HDECAL;AL=FFH减1指令DEC返回

指令格式:DAS指令功能:对AL中两个压缩的BCD码相减后的结果进行调整.调整操作为:若AL的低4位>9或AF=1,则:(AL)←(AL)-6,且AF←1若AL的高4位>9或CF=1,则:(AL)←(AL)-60H,且CF←1压缩BCD码减法调整指令DAS返回

指令格式:AAS指令功能:对AL中两个非压缩BCD码相减的结果进行调整.调整操作为:若AL的低4位>9或AF=1,则:①(AL)←(AL)-6,(AH)←(AH)-1,AF←1②(AL)←((AL)∧0FH)③CF←AF否则:(AL)←((AL)∧0FH)非压缩BCD码减法调整指令AAS接下页例:16-8=?MOVAX,0106HSUBAL,08H;AH=01H,AL=FEH00000110B;AF=1,CF=1-00001000B11111110BAAS;AH=0,AL=08H,CF=1,AF=1-00000110B11111000B

∧000011111B000010000B非压缩BCD码减法调整指令AAS返回

指令格式:NEGdst

指令功能:0-(dst)→(dst)例:NEGAL;对AL中的数取补码若(AL)=0,执行后(AL)=0,CF=0若(AL)=FCH,执行后(AL)=04H,CF=1FCH是-4的补码,执行后(AL)=04,故利用NEG指令可得到负数的绝对值。如果操作数的值为80H(-128)或8000H(-32768),则执行求补指令后,结果不变,但OF=1。本指令对6个标志位均有影响.求补指令NEG返回

指令格式:CMPdst,src

指令功能:(dst)-(src),影响标志位.注意:目的操作数不发生变化.

如何根据标志位来判断两个操作数的比较结果呢?⑴若两个所比较的数相等,则比较后ZF=1,否则ZF=0。这样根据ZF就可判断两个数是否相等。比较指令CMP接下页

⑵若两个数不相等,如何根据标志位来判断谁大谁小呢?分两种情况考虑:

①比较的是两个无符号数

若CF=0,则被减数大,因大数减小数无须借位.

若CF=1,则被减数小。

比较指令CMP接下页

②比较的是两个有符号数

若两个数都是正数或负数时,相减不溢出(即OF=0),可用SF来判断,若SF=0,表示被减数大,SF=1则反之。若比较的数中有一个为正,另一个为负,此时不能单看SF,还需考虑OF,判别条件:OF=0时,若SF=0被减数大;若SF=1减数大.OF=1时,若SF=1被减数大;若SF=0减数大.

也可归纳为:OF⊕SF=0时(或SF=OF),被减数大.OF⊕SF=1时(或SF=OF),减数大.比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。比较指令CMP接下页

例如有符号数比较结果的条件转移指令:

JG/JNLE;大于转移,条件OF⊕SF=0,且ZF=0

JLE/JNG;小于或等于转移,条件OF⊕SF=1或ZF=1

例:比较AL、BL、CL中带符号数的大小,将最小数放在AL中。程序段如下:

CMPAL,BL;AL和BL比较

JNGBBB;若AL≤BL,则转

XCHGAL,BL;若AL>BL,则交换BBB:CMPAL,CL;AL和CL比较

JNGCCC;若AL≤CL,则转

XCHGAL,CL;若AL>CL,则交换CCC:INT

20H;返回DOS比较指令CMP返回(1)无符号数乘法指令MUL(2)带符号数乘法指令IMUL(3)非压缩BCD码乘法调整指令乘法运算指令返回

指令格式:MULsrc指令功能:(src)×AL→AX(src是字节数据)(src)×AX→DX,AX(src是字数据)如:MULBL;BL×AL→AXMULBX;BX×AX→DX,AXMULBYTEPTR[SI];将EA=SI的内存单元的内容×AL→AX无符号数乘法指令MUL返回

指令格式:IMULsrc指令功能:(src)×AL→AX(src是字节数据)(src)×AX→DX,AX(src是字数据)参加运算的数据是带符号数,结果用带符号数补码表示带符号数乘法指令IMUL接下页例:若AL=96H,BL=12H;①MULBL;②IMULBL执行指令后①

AX=0A8CH;②AX=F88CH分析:

①AL=96H,BL=12H;96H×12H=0A8CH

②AL=96H,AL的真值为『96H』补=-6AH

BL=12H,BL的真值为+12H;(-6AH)×(+12H)=-774H;(-774H)补=(1000011101110100B)补

=1111100010001100B=F88CH乘法指令MUL

、IMUL返回

指令格式:AAM

指令功能:对AX内两个非压缩BCD码相乘结果进行调整

例:要求进行如下十进制乘法运算:7*8=?

可编程如下:MOVAL,07H;(AL)=07H MOVCL,08H;(CL)=08HMULCL;(AX)=0038HAAM;(AH)=05H,(AL)=06H

所得结果为非组合的BCD码。该指令影响标志位PF、SF、ZF,对其余标志位无定义非压缩BCD码乘法调整指令返回(1)无符号数除法指令DIV(2)带符号数除法指令IDIV(3)字节扩展指令CBW(4)字扩展成双字指令CWD(5)非压缩BCD码除法调整指令AAD除法运算指令返回指令格式:DIVsrc指令功能:两个无符号数相除:①src是字节AX/(src)→AL(商),AH(余数)②src是字DX,AX/(src)→AX(商),DX(余数)无符号数除法指令DIV返回指令格式:IDIVsrc指令功能:两个带符号数相除:①src是字节AX/(src)→AL(商),AH(余数)②src是字DX,AX/(src)→AX(商),DX(余数)

商及余数均为有符号数,且余数符号总是与被除数符号相同。带符号数除法指令IDIV接下页例:①

若AX=9FF0H,BL=F7H;

执行指令DIVBL后,AX=BDA5H例:②若AX=D99FH,BL=9FH;

执行指令IDIVBL后,AX=E465H分析:

AX=D99FH,AX的真值为『D99FH』补=-2661H

BL=9FH,BL的真值为-61H;(-2661H)÷(-61H)商65H,余-1CH=E4H;除法指令DIV

、IDIV返回指令格式:CBW指令功能:将AL扩展到AX(为除法指令做准备).①当AL的最高位是0,则AH=00H;②当AL的最高位是1,则AH=0FFH.字节扩展指令CBW返回指令格式:CWD指令功能:将AX扩展到DX,AX(为除法指令做准备).①当AX的最高位是0,则DX=0000H;②当AX的最高位是1,则DX=0FFFFH.字扩展成双字指令CWD返回指令格式:AAD指令功能:对AX中非压缩BCD码的被除数进行调整,保证结果正确.(在除法指令DIV前).非压缩BCD码除法调整指令AAD返回“与”运算指令AND“或”运算指令OR“非”运算指令NOT“异或”运算指令XOR测试指令TEST三、逻辑运算指令返回指令格式:ANDdst,src指令功能:(dst)∧(src)→(dst)

按位进行,影响标志位(AF除外)

例:MOVAL,5AHANDAL,0FH;AL=0AH“与”运算指令AND返回指令格式:ORdst,src指令功能:(dst)∨(src)→(dst)按位进行,影响标志位(AF除外)例:MOVAL,5AHORAL,0FH;AL=5FH“或”运算指令OR返回指令格式:NOTdst指令功能:dst→dst例:MOVAL,5AHNOTAL;AL=A5H“非”运算指令NOT返回指令格式:XORdst,src指令功能:(dst)⊕(src)→(dst)按位进行,影响标志位(AF除外)

例:MOVAL,5AHXORAL,0FH;AL=55H“异或”运算指令XOR返回指令格式:TESTdst,src指令功能:(dst)∧(src)影响标志位,不改变操作数例:若AX=9FF0H,BX=4000H;

执行指令TESTAX,BX后,

AX=9FF0H,BX=4000H;ZF=1

测试指令TEST返回移位次数Count=1,直接写入指令;大于1时,应送入CL预先设定。逻辑移位指令算术移位指令循环移位指令通过进位位循环移位指令例题四、移位指令返回

逻辑移位的特点是移出的位进入进位位CF,空出的位用“0”填入。①逻辑左移指令指令格式:SHLdst,count

指令功能:例:MOVAL,9EH;AL=9EH=10011110B

SHLAL,1;CF=1,AL=00111100B=3CH逻辑移位指令接下页②逻辑右移指令指令格式:SHRdst,count指令功能:例:MOVAL,9EH;AL=9EH=10011110BMOVCL,2

SHRAL,CL;CF=1,AL=00100111B=27H逻辑移位指令返回①算术左移指令指令格式:SALdst,count指令功能:与逻辑左移指令功能完全相同。二进制数据左移一位相当于乘2。例:MOVAL,24H;AL=24H=00100100B=36

SALAL,1;AL=01001000B=48H=72SALAL,1;AL=10010000B=90H=144算术移位指令接下页②算术右移指令指令格式:SARdst,count

指令功能:最高位保持不变,其他各位右移二进制数据右移一位相当于除2。例:MOVAL,84H;AL=84H=10000100B;(X)补=10000100BX=-1111100B=-7CHSARAL,1;AL=11000010B;(X)补=11000010BX=-0111110B=-3EH算术移位指令返回①循环左移指令指令格式:ROLdst,count指令功能:循环移位指令接下页②循环右移指令指令格式:RORdst,count指令功能::循环移位指令返回①通过进位位循环左移指令指令格式:RCLdst,count指令功能:通过进位位循环移位指令接下页②通过进位位循环右移指令指令格式:RCRdst,count

指令功能:通过进位位循环移位指令返回例:ASCII码→BCD码35H→05H33H→03H

(1)ANDAL,OFH;

(2)SUBAL,30H;

例题返回串传送指令——MOVS串比较指令——CMPS串扫描指令——SCAS从串取指令——LODS存入串指令——STOS五、串操作指令返回

指令格式及操作:

MOVSoprd1,oprd2;将源串地址中的字/字节送到目的串地址中(常用于段超越场合)。

MOVSB(字节) MOVSW(字)注意:

1)不影响标志位。

2)常与REP前缀指令配合使用。串传送指令——MOVS接下页例:将2000H:1200H地址开始的100个字节传送到6000H:0000H开始的内存单元中去。

movax,2000h movds,ax ;设定源串段基址

movax,6000h moves,ax ;设定目的串段基址

movsi,1200h ;设定源串偏移地址

movdi,0 ;设定目的传偏移地址

movcx,100 ;串长度送CX cld ;确定地址指针增量方向

repmovsb ;执行串操作指令串传送指令——MOVS返回指令格式及操作:

CMPSoprd1,oprd2

;将源、目的串地址中的字/字节进行比较(相减),结果不送目标地址。

CMPSB CMPSW注意:

1)影响标志位。

2)常与REPZ/REPE、REPNZ/REPNE配合使用,用来检查两字符串是否相等。串比较指令——CMPS接下页例:比较两个字符串是否相同,并找出其中第一个不相等字符的地址,将该地址送BX,不相等的字符送AL。两个字符串的长度均为200字节,M1为源串首地址,M2为目的串首地址。 lea si,M1 lea di,M2 mov cx,200 cld repe cmpsb 串比较指令——CMPS返回and cx,0ffh jz stop dec si mov bx,si mov al,[si]stop: hlt 指令格式及操作:

SCASoprd

;将AL/AX中的值与oprd字/字节相相减,结果不送目标地址,自动修改指针。

SCASB SCASW

注意:

1)影响标志位。

2)常与REPZ/REPE、REPNZ/REPNE配合使用,用来在一个字符串中搜索特定的关键字。串扫描指令——SCAS接下页例:在ES段中从2000H单元开始存放了10个字符,寻找其中有无字符’A’。若有则记下搜索次数,放入DATA1单元,‘A’的地址放DATA2单元。 movdi,2000h movbx,di movcx,0ah mov al,‘A’ cld repnzscasb and cx,0ffffh jz found串扫描指令——SCAS返回movdi,0 jmpdone found:decdi

mov data2,di

inc di sub di,bxdone: mov data1,di指令格式及操作:

LODSsrc;将源操作数送到AL或AX中,并根据DF修改指针。(常用于段超越场合)。

LODSB LODSW

注意:

1)不影响标志位。

2)一般不带重复前缀。从串取指令——LODS返回指令格式及操作:

STOSdest

;将AL或AX中的内容送到目的地址中,并根据DF修改指针。

STOSB STOSW注意:

1)不影响标志位。

2)常与REP前缀配合,给内存中一连续区域置相同值。存入串指令——STOS返回控制转移类指令的寻址方式无条件转移指令条件转移指令循环控制指令过程调用和返回指令六、控制转移类指令返回

指令执行顺序是由代码段寄存器CS和指令指针寄存器IP确定的。执行顺序程序时,BIU(总线接口部件)每取一字节指令,IP就自动加1,指向下一指令字节。控制转移类指令的目的就是通过改变CS、IP,实现对程序流向的控制。(1)段内转移(2)段间转移控制转移指令的寻址方式返回又称近转移。①“NEAR”指明在同一段的转移,IP的值被改变。②“SHORT”指明在同一段内更短距离的转移。(-128~+127)段内转移返回又称远转移。“FAR”指明要转到另一个逻辑段执行程序,CS和IP都被修改。段间转移返回指令格式:JMPdst指令功能:使程序无条件地转移到dst指明的目的地址去执行。不影响标志位。由于8086/8088CPU的内存是分段的,故JMP指令分成4种情况。无条件转移指令接下页

①段内直接转移JMP其直接转向的目标地址由指令给出,根据给定的位移量是8位还是16位分成如下两种情况:

位移量转移范围

汇编语言中格式

8位

-128~+127

JMPSHORTOPRD

16位-32768~+32767JMPNEARPTROPRD例:JMP0120H;直接转向0120HJMPSHORTLPI;转向LPIJMPNEARPTRBBB;转向BBB这种转移只在段内,代码段寄存器CS内容不变无条件转移指令接下页

②段内间接转移转移的目标地址由寄存器或存储单元的内容给出。例:JMPSI若指令执行前,(SI)=1200H则指令执行后,(IP)=1200H,于是转向1200H无条件转移指令接下页

例:JMP[BX+DI]若指令执行前:(DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H则指令执行后:(IP)=2350H在汇编语言中,这种存储器寻址通常写成:JMPWORDPTR[BX+DI]表示所取得的目标地址是一个字有效地址。无条件转移指令接下页

③段间直接转移

采用这种寻址方式,指令直接提供了要转移的段地址和偏移地址。

例:JMP2000:1000H

执行时,(IP)←1000H,(CS)←2000H

在汇编中,则在符号地址前加操作符FAR

PTR来表示,例:JMP

FAR

PTR

BBB无条件转移指令接下页

④段间间接转移

将指定的存储单元中两个相邻的字内容送IP及CS。

例如:JMP

DWORDPTR[SI]

设指令执行前:(DS)=4000H,(SI)=1212H,

(41212H)=1000H,(41214H)=4A00H

则指令执行后:(IP)=1000H,(CS)=4A00H,程序转到4B000H继续执行指令。

例中DWORDPTR,在汇编语言中表示双字操作符。

JMP指令对标志位无影响。无条件转移指令返回

条件转移指令是根据上一条指令执行后的标志位的状态来决定程序是否转移。当条件成立时,便转向指令中给出的目标地址;当条件不成立时,程序按顺序执行。所有的条件转移指令,规定只能以本指令为中心的-128~+127字节范围内转移。

指令格式:Jccdst8

指令功能:当转移条件cc成立时,转移到目的地址去执行;否则按顺序执行。不影响标志位。

转移条件cc

例题条件转移指令返回以标志位的状态作为转移条件

转移条件cc接下页助记符转移条件助记符转移条件JZ/JEZF=1JNZ/JNEZF=0JSSF=1JNSSF=0JOOF=1JNOOF=0JP/JPEPF=1JNP/JPOPF=0JCCF=1JNCCF=0JCXZCX=02.以两个无符号数比较的结果作为转移条件转移条件cc接下页助记符转移条件JA/JNBECF∨ZF=0

高于/不低于等于JAE/JNB/JNCCF=0

高于或等于/不低于/无借位JB/JNAE/JCCF=1

低于/不高于等于/有借位JBE/JNACF∨ZF=1

低于或等于/不高于3.以两个带符号数比较的结果作为转移条件转移条件cc返回助记符 转移条件 JG/JNLE(SF⊕OF)∨ZF=0 大于/不小于等于JGE/JNLSF⊕OF=0 大于或等于/不小于JL/JNGESF⊕OF=1 小于/不大于等于JLE/JNG(SF⊕OF)∨ZF=1小于或等于/不大于分析下列程序段,程序转向哪里?ADDAX,BXJNOL1JNCL2SUBAX,BXJNCL3JNOL4JMPSHORTL5①AX=B568H,BX=54B7H例题接下页解:第一步:ADDAX,BXAX=B568H1011010101101000BX=54B7H0101010010110111AX=0A1FH0000101000011111所以,CF=1,OF=0第二步:JNOL1;OF=0,满足条件,转去L1执行例题接下页分析下列程序段,程序转向哪里?ADDAX,BXJNOL1JNCL2SUBAX,BXJNCL3JNOL4JMPSHORTL5

②AX=42C8H,BX=608DH例题接下页解:第一步:ADDAX,BXAX=42C8H0100001011001000BX=608DH0110000010001101AX=A355H1010001101010101所以,CF=0,OF=1第二步:JNOL1;OF=1,不满足条件,顺序执行第三步:JNCL2;CF=0,满足条件,转去L2执行例题接下页编写一段指令序列,测试AL的内容,若低4位全为0,就转移去NEXT执行程序,否则按顺序执行.例题返回解:TESTAL,0FHJZNEXT

循环指令的作用是控制某程序段反复执行的次数。⑴指令格式:LOOPdst8

指令功能:CX-1→CX,若CX≠0,就转去dst循环执行程序;若CX=0,顺序执行后续程序。不影响标志位。实际上,该指令可以等价两条指令:DECCX;CX-1→CXJNZdst;ZF=0,转向dst执行

循环控制指令接下页

(2)LOOPZ/LOOPE首先使(CX)-1,判断只有在(CX)≠0,且ZF=1的条件下,才转至目标地址。若(CX)=0或ZF=0,则退出循环。

(3)LOOPNZ/LOOPNE此指令先使(CX)-1,只有在(CX)≠0,且ZF=0的条件下,才转至目标地址。若(CX)=0,或ZF=1,则退出循环。

(4)JCXZ;若(CX)=0,则转移循环控制指令接下页例1:要求在显示器上显示DI中偏移地址。程序段如下:MOVBX,DI;MOVCX,4;CX做计数器ROT:ROLBX,1

ROLBX,1

ROLBX,1

ROLBX,1;将最高4位移到低4位MOVAL,BLANDAL,0FH;取出低4位ADDAL,30H;化为ASCII码CMPAL,3AH;与3AH比较循环控制指令-例1接下页JLBBB;若(AL)<3A,则转ADDAL,07H;若(AL)≥3A,加07BBB:MOVDL,AL;(DL)←显示字符MOVAH,02INT21H;显示输出,参阅附录CLOOPROT;偏址显示完否?没有,转回MOVDL,48HMOVAH,02INT21H;最后显示’H’循环控制指令-例1接下页请编写指令序列,确定AL中“1”的个数。解:XORAH,AH;累加器清零MOVCX,08H;设置循环次数Stat:ROLAL,1;AL循环左移1位;AL的最高位送CFJNCLp;CF=0,转移到LpINCAH;CF=1,AH+1→AHLp:LOOPStat ;CX-1→CX,CX≠0,;循环到Stat执行

HLT ;程序段结束循环控制指令-例2返回

程序设计时,往往把某些具有独立功能的程序编写成独立的程序模块,称之为子程序,可以供其他程序调用。方法的优点是:源程序长度缩短,有利于模块化设计,使程序的编制、阅读和修改都比较方便。(1)调用指令指令格式:CALLdst(子程序名)

指令功能:无条件的转移到执行子程序;(2)返回指令指令格式:RET

指令功能:在子程序结尾处必须有这条指令,保证子程序结束后返回原程序调用处。过程调用和返回指令接下页

(1)调用指令CALL由于子程可能与主程序同在一个段内,也可能不同在一个段内,与JMP指令类似,调用指令也分如下四种。①段内直接调用例:CALL0120H;调用地址由指令给出.执行的操作为:((SP)-1,(SP)-2)←(IP);IP压栈(SP)←(SP)-2;修改SP

(IP)←(IP)+偏移量过程调用和返回指令接下页

温馨提示

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

评论

0/150

提交评论