版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章80x86寻址方式和指令系统3.1执行指令和非执行指令3.28086/8088指令编码格式3.38086/8088寻址方式3.48086/8088指令系统3.580X86的寻址方式和新扩展指令3.1执行指令和非执行指令
可执行指令和非执行指令(伪指令)的主要区别是前者有操作码,后者无操作码。操作码是指挥计算机各逻辑电路正确工作的机器代码。可执行指令和非执行指令的相同之处是有的不需要操作数,有的需要1个或多个操作数。操作数是指令执行或程序识别时所需的数据信息或数据存放的地址信息。可执行指令简称指令,本书所提的“指令”,在不加申明的场合均是指可执行指令。为区别计,非执行指令又称伪指令。
无论哪种计算机,都必须要求它的指令通过操作码明白无误地告诉CPU完成什么样的功能操作。大多数指令由两部分组成:第一部分为操作码,指出实现哪种操作,比如是传送数据到存储单元或I/O端口,还是进行算术逻辑运算等等;第二部分为操作数,指明操作数是什么或者存放的地址,以及操作结果送到什么地方去。无操作数指令只有第一部分。指令以二进制数形式存放在内存代码段中。编制程序时如果直接用二进制数书写指令,既不方便又易出错,为此编程使用的指令都是以符号形式出现的,其中操作码使用易于识别的助记符,操作数使用立即数、寄存器名或存储单元的地址。80X86指令的基本格式为:助记符目的操作数(可选),源操作数(可选)
(MnemonicsDestinationOperand,SourceOperand)
当把指令格式键入到微机中时,机内的编译程序自动将其译为二进制数机器码并放入内存,让CPU取指并执行。80X86CPU字长有限,为让指令系统有较强的字长处理功能,指令格式安排上常采取如下一些做法:1、单操作数的操作结果送回存放操作数的地方;2、双操作数的操作结果送回存放目的操作数的地方,由此得知立即数在任何指令中都不能成为目的操作数;3、存储单元的地址使用逻辑地址,考虑到段寄存器和存放偏移量的寄存器要配对使用,因此指令中只出现存放偏移量的寄存器名,只有在段跨越情况下才同时出现段寄存器名和偏移量寄存器名;4、无论是操作码,还是操作数,机器码都以字节为单位;
5、操作数为寄存器内容时,指令直接使用寄存器名;6、操作数为存储单元内容时,指令中出现的是存储单元的地址,存储单元的内容不会出现在指令中;7、指令划分方法有两种:按字节长度划分和按操作数个数划分,前者将指令划分为单字节指令和多字节指令,后者分为无操作数、单操作数和双操作数3种;8、多字节指令机器码必须按顺序存放在代码段中,遇到有16位地址偏移量或16位立即数,应当将低字节放入低地址,高字节放入高地址。
9、伪指令无操作码,因此不能被计算机执行,也不能驱动相关逻辑电路动作,只能被汇编程序识别,用于对程序的说明。伪指令的基本格式为:伪操作助记符操作数(可选)
10、
段跨越前缀:存储单元的地址用逻辑地址“基址:偏移量”表示时,指令中为了简便起见,只出现偏移量表示,对段寄存器采取默认(又名“缺省”)的方式,例如传送指令MOVAX,[BX]的源操作数就在存储器中,其偏移量就放在BX中,与BX配套的段寄存器默认为DS,计算机将到数据段中地址为DS×10H+BX的存储单元去取源操作数。如果源操作数不在数据段而在其它段,例如在附加段中,偏移量却依旧在BX中,那么就应将指令格式修改成MOVAX,ES:[BX]。这种情况被称为“段跨越”,跨越到其它段去找操作数,ES不是BX默认配套的段寄存器。段跨越又称为段越界。
有3种情况不能使用段跨越:
①程序只能在代码段中;②使用SP寻址的堆栈操作,段寄存器只能用SS;③使用DI的目的串操作,段寄存器只能用ES。
3.28086/8088寻址方式
指令中寻找操作数的方式称为寻址方式。通常在存储器中的寻址方式越多,编制程序越灵活。但无论哪种计算机,相应的寻址方式只有5种,因为操作数只可能在5个地方:1、隐含在指令中;2、以立即数形式直接出现在指令中;3、在寄存器中;4、在存储器中;5、在I/O设备中。
1.隐含寻址
操作数不在指令中出现的寻址方式称为隐含寻址,这种方式用于对特定的寄存器实现特定操作。例如DAA,指令中无AL出现,机器码27H中无AL编码出现,其功能却是将AL的内容调整为十进制数。
2.立即寻址
操作数直接出现在指令中的寻址方式称为立即寻址,相应的操作数称为立即数。例如指令“ADDAX,04A5H”,对源操作数04A5H就是立即寻址(对目的操作数AX是寄存器寻址)。规定立即数只能是8位或16位整数,不能为小数或其它类型。如果是16位,则机器码中以字节为单位排放,低字节在前,高字节在后,本条指令机器码就是81C0A504H。立即数只能作源操作数,不能作目的操作数。立即寻址用于给寄存器或存储器赋初值。
3.寄存器寻址
操作数在CPU内部寄存器中且指令给出寄存器名的寻址方式,称为寄存器寻址。操作数有8位、16位之分,如果是8位操作数,则只能是AH、AL、BH、BL、CH、CL、DH、DL中的一个;如果是16位操作数,则只能是8个通用寄存器AX、BX、CX、DX、SP、BP、SI、DI和4个段寄存器CS、DS、SS、ES中的一个。例如:INCCX;CX+1→CX,机器码为41H,目的操作数为寄存器寻址MOVDS,AX;DS←AX,机器码为8EC8H,目的操作数和源操作数都为寄存器寻址
4.存储器寻址
指令中给出存储单元地址的寻址方式,称为存储器寻址。有段跨越时,指令中出现“段寄存器名:偏移量”;无段跨越时,仅有偏移量出现在指令中,相应段寄存器采用默认的方式。偏移量用有效地址EA表示,一般计算公式为
按照偏移量的表现形式,a.存储器寻址分为直接寻址、b.寄存器间接寻址、c.寄存器相对寻址、d.基址加变址、e.相对基址加变址、f.串操作寻址、g.转移类指令寻址共7种方式。各种寻址方式的EA计算如图3-1所示,图中PA(PhysicsAddress)为物理地址。图3-1存储器寻址方式(a)直接寻址;(b)寄存器间接寻址;(c)寄存器相对寻址;(d)基址加变址寻址;(e)相对基址加变址寻址;(f)串操作寻址;(g)转移类指令寻址1)直接寻址
出现在指令中的EA是位移量DISP,即EA=DISP。在无段跨越情况下,默认操作数在数据段DS中,操作数的地址为DS:DISP。有段跨越时到跨越的段去找操作数。
2)寄存器间接寻址
这种寻址方式的特点是操作数在存储器中,存储单元的有效地址由BX、BP、SI和DI中的一个给出。指令中若没有用跨越指明段寄存器,则BP默认SS,其余3个默认DS。3)寄存器相对寻址
这种寻址方式的特点是EA由一个基址或变址寄存器内容加上一个8/16位位移量得到。寄存器为BX、BP、SI或DI,无段跨越时,BP默认SS,其余3个寄存器默认DS;有段跨越时,操作数在跨越段中。
4)基址加变址寻址
使用基址加变址寻址方式,有效地址EA由一个基址寄存器内容加上一个变址寄存器内容组成,指令中只可能出现[BX+SI]、[BX+DI]、[BP+SI]、[BP+DI]4种格式。在不发生段跨越的情况下,无BP出现的格式默认DS段寄存器;有BP出现的格式默认SS段寄存器。有段跨越时到跨越段中去寻找操作数。
5)相对基址加变址寻址
有效地址EA由一个基址寄存器内容、一个变址寄存器内容和一个8位位移量相加而成,默认段寄存器方法同上。
6)串操作寻址
数据串又称字符串,是存储器中若干依次排放数据的集合。数据串常用它的首地址(第1个数据的地址)和长度(数据个数)表示。源数据串首址存放在DS:SI中;目的数据串首址存放在ES:DI中。源数据串允许段跨越;目的数据串不允许段跨越。
7)转移类指令寻址
转移类指令分为段内转移和段间转移两种。1、所有的条件转移指令都只能实现段内转移,指令中出现的是8位位移量,转移地址范围限于本条指令地址的-128~+127字节内,称之为段内短转移。2、无条件转移指令和调用指令有段内短转移、段内区间转移、段内长转移、段间区间转移和段间长转移5种,具体转移寻址方法在3.4.5节中讨论。【例3-8】设CS=2000H,DS=3000H,SS=4000H,ES=5000H,BX=1020H,BP=3040H,SI=5060H,DI=7080H,DISP=0102H,讨论下列指令源操作数的寻址方式,并计算EA和PA。
(1)MOVAX,[0A0AH]这是一条直接寻址的指令,EA=0A0AH,PA=DS×10H+EA=30A0AH,指令执行结果是把数据段中3000H:0A0AH和3000H:0A0BH两单元的内容送AX。(2)MOVDX,ES:[76B0H]这是一条直接寻址的有段跨越指令,EA=76B0H,PA=ES×10H+EA=576B0H,指令执行结果是把附加段中5000H:76B0H和5000H:76B1H两单元的内容送DX。
(3)MOVCL,[BX]这是一条寄存器间接寻址的指令,EA=1020H,PA=DS×10H+EA=31020H,指令执行结果是把数据段中3000H:1020H单元的内容送CL。(4)MOVCX,CS:1234H[BP]这是一条寄存器相对寻址有段跨越的指令,EA=4274H,PA=CS×10H+EA=24274H,指令执行结果是把代码段中2000H:4274H和2000H:4275H两个单元的内容送CX。该指令也可以写成“MOVCX,CS:[BP+1234H]”。格式中的1234H(一般为8/16位位移量DISP)也可以用符号表示,如写成“MOVCX,CS:COUNT[BP]”或“MOVCX,CS:[BP+COUNT]”,这时EA=BP+COUNT,而COUNT的大小需先用伪指令定义。
(5)MOVSS,[BP+SI]这是一条基址加变址寻址的指令,EA=80A0H,PA=SS×10H+EA=480A0H,指令执行结果是把堆栈段中的4000H:80A0H和4000H:80A1H两个单元的内容送SS,该指令也可以写成“MOVSS,[BP][SI]”。(6)MOVDX,DISP[BP][DI]这是一条相对基址加变址寻址的指令,EA=A122H,PA=SS×10H+EA=4A122H,源操作数逻辑地址是堆栈段中的4000H:A122H和4000H:A123H两个单元,该指令还可写成“MOVDX,DISP[BP+DI]”或“MOVDX,[DISP+BP+DI]”。
堆栈是存储器的一部分,堆栈操作的寻址方式有两种。一种用SS:BP,专用于数据存取,寻址方式如上所述。另一种用SS:SP,专用于入、出栈操作,但SP不会出现在指令中,入栈时只有源操作数出现在指令中,入栈时的目的操作数SS:SP属于隐含寻址。出栈时只有目的操作数出现在指令中,出栈时的源操作数SS:SP也属于隐含寻址。
在存储器寻址方式中,BX和BP分别称为基址寄存器和基址指针,它们均可作基址使用。例如“MOVCX,COUNT[BP]”可用于堆栈段中的表格处理,将BP作表格的基址,改变COUNT位移量值,可查得表中的对应值。5.I/O端口寻址
80X86指令系统使用I/O指令对I/O端口寻址,有直接和DX间接寻址两种方式。前一种的特点是用8位二进制数表示的I/O端口地址直接出现在指令中,例如“INAL,36H”,含义是地址为36H的I/O端口内容送AL。源操作数就是直接I/O端口寻址方式,目的操作数属于寄存器寻址。后一种的特点是16位端口地址放在DX中,例如INAL,DX,含义为DX指明的I/O端口内容送AL,源操作数就是DX间接寻址方式,目的操作数属于寄存器寻址。3.38086/8088指令系统3.3.1数据传送指令数据传送是微机内最基本、最重要、最频繁、任何一个程序内使用次数最多的操作。它的功能是完成寄存器与寄存器之间、寄存器与存储器之间、寄存器与I/O端口之间字节或字的传送,以及把8位或16位立即数送至寄存器或存储器。在存储器成为操作数的时候,可以使用任何一种寻址方式。这类指令又可以分为通用传送、地址传送、标志传送和累加器专用传送4类,如表3-7所示,它们中仅仅只有SAHF和POPF指令影响FLAGS。表3-7数据传送指令
1.通用传送指令
通用传送指令包括基本传送指令MOV、堆栈操作指令PUSH和POP、数据交换指令XCHG3种。
1)MOV指令格式:MOVDST,SRC
功能:DST←SRC,把一个字节或一个字从源传送到目的。使用通用传送指令应注意:(1)立即数不能成为目的操作数;(2)CS不能成为目的操作数;(3)IP、FLAGS不能成为源或目的操作数;(4)不允许存储单元同时成为源和目的操作数;(5)不允许立即数送段寄存器;(6)不允许段寄存器同时成为源和目的操作数。
此外,在给SS寄存器赋值时,系统将自动禁止外部中断,直到本条和下条指令执行后,才开中断。这样,可用连续两条MOV指令依次给SS、SP赋值,有效制止堆栈空间改变过程中去响应中断。
【例3-9】将立即数2000H送段寄存器DS,建立数据段基址。
解由于不允许立即数直接送段寄存器,因此用8个通用寄存器之一作桥梁:
MOVAX,2000H
MOVDS,AX;也可以使用其它的通用寄存器,但多使用AX,其它7个多作专用【例3-10】判断指令正误:MOVCS,AX错;不允许对CS赋值MOVAX,CS对MOVSS,SP 对 MOVAX,ES 对MOVDS,CS错;源目的操作数不能同为段寄存器MOVAX,IP 错;IP不能作为源和目的操作数MOVBYTEPTR[BX],CS 错;源目的操作数类型不符(源为字节,目的为字)MOVWORDPTR[BX],CS 对MOVBYTEPTR[BX],256 错;源目的操作数类型不符(源为字节,目的为字)MOVBYTEPTR[BX],255 对【例3-11】MOVAH,AL为字节传送:AH←AL。
【例3-12】MOVAL,AH功能是什么?答有两种可能:
REG→REG;立即数AH→AL。
为了防止混乱起见,以字母开头的立即数前加“0”或“#”,即:MOVAL,AH是AH→AL;MOVAL,0AH是10→AL。
从MOVSI,[5678H]和MOVCL,[5678H]比较看出,指令中的寄存器名称已经决定了前一个为字操作,后一个为字节操作。但为了清楚起见,在地址偏移量前面用“WORDPTR”和“BYTEPTR”分别表示“字参数”和“字节参数”。
指令中出现的位移量常常使用符号代替,例如MOVSI,[5678H]可用MOVSI,[BUFFER]取代(含义为DS:BUFFER和DS:BUFFER+1两个单元的内容送SI)。符号BUFFER在本条指令中等于5678H。关于符号位移量说明如下:
(1)在指令中使用符号的好处是能把指令表示成一般的形式,符号取不同的值,代表了所有的8位或16位位移量。
(2)符号作地址偏移量时,括号可以省去,如MOVSI,[BUFFER]可以简写成MOVSI,BUFFER,即MOVSI,[BUFFER]和MOVSI,BUFFER执行结果相同。
(3)8位或16位位移量作地址偏移量时,括号不能省。试比较MOVSI,[5678H]和MOVSI,5678H,前者把存储单元中的内容送到SI,源操作数用的是存储器寻址方式中的直接寻址;后者把立即数送到SI,源操作数用的是立即寻址。两条指令的执行结果不同。
(4)MOVSI,5678H中的立即数也可以用符号代替,例如使用名为NUMBER的符号,但是必须要加上“OFFSET”,写成MOVSI,OFFSETNUMBER。指令中OFFSET称为属性操作符,又称为数值返回操作符,表示其后紧跟的是存储单元的立即数地址,而不是存储单元的内容。使用16位数字量和符号的典型用法如表3-8所示。表3-8MOV指令中的数字量和符号用例【例3-13】设DS=2000H,则指令MOVSI,[5678H]的执行示意图如图5-3所示。
在字传送时,位于数据段DS:5678H单元的内容送SI的低8位,DS:5679H单元内容送SI的高8位,执行结果SI=0B7AH。图5-3MOVSI,[5678H]的执行示意图2)堆栈操作指令(1)入栈指令。格式:PUSHSRC示意图如图3-4所示。功能:分两步完成(SS×10H+SP-2)←SRC(16位)。第1步,SP←SP-1,(SS×10H+SP)←SRC高8位;第2步,SP←SP-1,(SS×10H+SP)←SRC低8位。图5-4PUSH指令(2)出栈指令。格式:POPDST示意图如图3-5所示。功能:分两步完成DST(16位)←(SS×10H+SP+2)。第1步,DST低8位←(SS×10H+SP),SP←SP+1;第2步,DST高8位←(SS×10H+SP),SP←SP+1。图5-5POP指令
堆栈操作指令有如下特征:1、堆栈操作为字操作;2、能入栈的只能是8个通用寄存器AX、BX、CX、DX、SP、BP、SI、DI,4个段寄存器DS、SS、ES、CS,以及字存储单元;3、能出栈的只能是8个通用寄存器AX、BX、CX、DX、SP、BP、SI、DI和3个段寄存器DS、SS、ES,以及字存储单元;
4、字数据入、出栈,遵循低字节在低址、高字节在高址的数据存放规则,即入栈时高字节先入、低字节后入,出栈时低字节先出、高字节后出。
PUSHAH、POPCL等字节操作是非法的,PUSH0A0AH、PUSHIP、PUSHFLAGS、POP0A0AH、POPIP、POPFLAGS、POPCS等指令格式也是非法的。3)字节或字交换指令
格式:XCHGDST,SRC
示意图如图3-6所示。
功能:DST和SRC互换内容。仅限于8/16位通用寄存器之间、8/16位通用寄存器和存储单元之间互换内容。图5-6XCHG指令指令格式:XCHGREG/MEM,REG【例3-14】设AX=0123H,(DS×10H+SI+0400H)=4567H。执行XCHGAX,[SI+0400H]后,AX=4567H,(DS×10H+SI+0400H)=0123H。
2.地址传送指令
地址传送指令包括送地址偏移量指令LEA、送“DS:偏移量”指令LDS、送“ES:偏移量”指令LES3种,用于传送段基址和偏移地址。
1)LEA指令
格式:LEADST,SRC
示意图如图3-7所示。功能:把存储单元的16位有效偏移地址EA送指定的寄存器。图5-7LEA指令【例3-15】执行前SI=2030H。执行LEASI,[4A1BH]后,SI=4A1BH,为把某单元的偏移地址4A1BH送SI。执行MOVSI,4A1BH后,SI=4A1BH,为把立即数4A1BH送SI。执行LEASI,[SI+4A1BH]后,SI=6A4BH。2)LDS指令(LDS是“LoadDataSegment”的简写)
格式:LDSDST,SRC
示意图如图3-8所示。功能:把内存4个单元的32位数送到段寄存器DS和由DST指出的偏移量寄存器。低16位→BX/SI/DI,高16位→DS,且低字节→低位,高字节→高位。图5-8LDS指令【例3-16】执行LDSSI,[DI+100AH]指令的结果是SI←(DS×10H+DI+100AH,DS×10H+DI+100BH),DS←(DS×10H+DI+100CH,DS×10H+DI+100DH)。设执行前DS=2000H,SI=A024H,DI=0005H,则指令指出的存储单元地址为:20000H+0005H+100AH=2100FH,21010H,21011H,21012H。设4个单元的内容如下:则指令执行后,DS=2230H,SI=0180H,DI=0005H。图5-9LES指令【例3-17】LESDI,[BX]指令使用BX间接寻址,表明源操作数在数据段内。设执行前DS=B000H,ES=2A00H,BX=080AH,(B080AH)=A2H,(B080BH)=05H,(B080CH)=00H,(B080DH)=40H,则执行后,DI=05A2H,ES=4000H,BX=080AH。
3.标志位传送指令
标志位传送指令包括读标志指令LAHF、写标志指令SAHF、FLAGS入栈指令PUSHF、FLAGS出栈指令POPF共4种,用于了解或保存标志寄存器的内容,或设置某些标志位。
1)读标志指令LAHF
格式:LAHF
功能:AH←FLAGSL(内含5个标志位CF、PF、AF、ZF、SF)。2)写标志指令SAHF格式:SAHFLAHF和SAHF指令示意图如图3-10所示。功能:FLAGL(内含5个标志位CF、PF、AF、ZF、SF)←AH。图3-10LAHF和SAHF指令3)FLAGS入栈指令PUSHF
格式:PUSHF
功能:FLAGS入栈。入栈操作步骤依次为SP←SP-1,(SS×10H+SP)←FLAGSH,SP←SP-1,(SS×10H+SP)←FLAGSL。FLAGSH和FLAGSL是FLAGS的高、低8位。4)FLAGS出栈指令POPF
格式:POPF
功能:FLAGS出栈。出栈操作步骤依次为FLAGSL←(SS×10H+SP),SP←SP+1,FLAGSH←(SS×10H+SP),SP←SP+1。入、出栈指令常成对使用,分别用于子程序和中断服务程序首尾,保护和恢复主程序的各个标志位。
5)LES指令(LES是“LoadExtraSegment”的简写)
格式:LESDST,SRC
功能:把指令指出的源操作数4个存储单元的内容分别送存放EA的寄存器和ES。低16位→BX/SI/DI,高16位→ES,且低字节→低位,高字节→高位。
4.累加器专用传送指令
1)I/O数据传送指令
(1)输入指令IN。格式:INAC,PORT
功能:I/O端口的8/16位二进制数传送到AL/AX。格式中AC表示AL或AX;PORT表示I/O端口地址。I/O端口地址为8位时,PORT可以是用8位立即数表示的直接地址,地址编号为0~255(00H~FFH),也可以是已定义过的8位符号常量;I/O端口地址为16位时,PORT只能是DX间接寻址,地址编号为0~65535(0000H~FFFFH)。IN指令的格式有4种形式:INAX,8位PORT;INAL,8位PORT;INAX,DX;INAL,DX。
(2)输出指令OUT。
格式:OUTPORT,AC
功能:AL/AX的8/16位二进制数传送到I/O端口。格式中AC表示AL或AX;PORT表示I/O端口地址,说明同于IN指令。OUT指令的格式也有4种形式:OUT8位PORT,AX;OUT8位PORT,AL;OUTDX,AX;OUTDX,AL。2)字节翻译指令(代码转换指令或者查表指令)XLAT
格式:XLAT
功能:AL←(BX+AL)。本条指令完成一个字节的编码转换,转换前要先在内存中建立一个代码转换表。例如将十进制数0~9转换为数码显示的七段显示码表,设表首址DS=1000H,偏移量为0030H,则内存相应单元如下:显示“2”的程序段为:MOVAX,#1000H MOVDS,AX ;建立段基址MOVBX,0030H ;BX←0030H,首址→BXMOVAL,02H ;要转换的十进制数2→AL,AL=2HXLAT ;(DS×16+BX+AL)→AL,AL=24H, 将2转换为24H3.4.2算术运算指令表3-9算术运算指令表3-9算术运算指令1.加法指令
加法指令包括不带进位位的加法指令ADD、带进位位的加法指令ADC、加1指令INC,共3种。
1)不带进位位的加法指令格式:ADDDST,SRC
功能:DST←DST+SRC,CF←进位位。将目的操作数DST和源操作数SRC相加,结果放入DST中,进位位放入CF中。源操作数允许8位或16位立即数、通用寄存器和存储单元,目的操作数不允许是立即数,其它和源操作数相同,但不允许两者同为存储器操作数,由此有5种格式:ADDREG,DATA ;REG+DATA→REG,CF←进位位ADDMEM,DATA ;MEM+DATA→MEM,CF←进位位ADDMEM,REG ;MEM+REG→MEM,CF←进位位ADDREG,REG ;REG+REG→REG,CF←进位位ADDREG,MEM ;REG+MEM→REG,CF←进位位
2)带进位位的加法指令ADC
格式:ADCDST,SRC
功能:DST←DST+SRC+CF,CF←进位位。与ADD指令不同的是,ADC要把CF进位标志加入,且加法完成后CF将得新值。ADC的5种格式以及对DST、SRC的要求同于ADD指令。
【例3-19】多字节无符号数相加。以4字节为例,32位二进制数相加,设X=0007A379H,Y=00057E4FH,求X+Y,且和放在DX:AX中。试编程。
解:将第一个加数X放入DX:AX中,第二个加数放入BX:CX中。MOVAX,A379H MOVDX,0007H ;DX:AX=0007A379HMOVCX,7E4FH MOVBX,0005H ;BX:CX=00057E4FHADDAXCX ;实现低16位相加,和→AX,进位→CFADCDX,BX ;两高16位及低16位来的进位位相加,和→DX,进 位→CF程序执行完,DX:AX=000D21C8H,CF=0。3)加1指令INC
格式:INCDST
功能:DST←DST+1。DST为8/16位通用寄存器或存储器操作数,不允许为立即数。
2.减法指令
减法指令包括不带借位位的减法指令SUB、带借位位的减法指令SBB、减1指令DEC、求补指令NEG、比较指令CMP,共5种。
1)不带借位位的减法指令SUB
格式:SUBDST,SRC
功能:DST-SRC→DST,借位→CF。实现8/16位二进制数减法,目的操作数是被减数,源操作数是减数,差放入目的操作数内,借位位送入CF标志位。目的操作数容许是8/16位通用寄存器、存储器,立即数不能作被减数;源操作数容许是8/16位通用寄存器、存储器、立即数,但不允许存储器同时为目的操作数和源操作数。通用寄存器指8个8位寄存器AH、AL、BH、BL、CH、CL、DH和DL以及8个16位寄存器AX、BX、CX、DX、SP、BP、SI和DI。涉及存储单元操作数的,可以使用任何一种寻址方式。这一类指令包括5种类型,如图3-11所示。图5-11SUBDST,SRC指令的类型通用REG←通用REG-通用REG;(b)通用REG←通用REG-存储器;(c)存储器←存储器-REG;(d)存储器←存储器-立即数;(e)通用REG←通用REG-立即数【例3-21】设CS=2000H,IP=9248H,DS=4000H,BX=3160H,SI=1020H,(41020H)=2130H,则指令SUBBX,[SI]的操作结果为BX=3160H-2130H=1030H,标志寄存器FLAGS的各位分别是:CF=0,PF=0,AF=0,ZF=0,SF=1,OF=0。2)带借位位的减法指令SBB
格式:SBBDST,SRC
功能:DST-SRC-CF→DST,借位→CF。完成带借位位的二进制数相减,与SUB指令的执行过程基本相同,不同的是多了一个减少CF的原状态,结果的借位位能使CF成为新状态。
3)减1指令DEC
格式:DECDST
功能:DST←DST-1。不影响CF位,但影响其它5个标志位。4)求补指令NEG
格式:NEGDST
功能:DST←0-DST,或DST←DST+1,或写成DST←0FFFFH-DST+1。所有位按位求反后加1,DST为8/16位通用寄存器或存储器操作数。本条指令说明如下:
①“+1”是指DST的所有位逐位求反后再加1,与“0-DST”的结果是一样的。例如设AL=00000100B=+4,逐位求反再加1后得+1=11111100=(-4)补,而0-DST=00000000-00000100,也得11111100=(-4)补。
②这条指令所说的“求补”实质上是:若DST为正数,求补得绝对值相等的负数(补码);若DST为负数(补码),求补得绝对值相等的正数。显然,求补指令的“求补”不同于第1章介绍的补码求法。第1章中求补的方法是:正数的补码是其原码自身;负数的补码是其反码加1。③因指令实现0-DST,除DST为0外,必然有借位,使CF=1。④当操作数为80H(-128)或8000H(-32768)时,执行NEG指令后,结果不变。但OF置1,有溢出。【例3-22】已知CH=1AH=00011010B=+26,执行NEGCH后,CH=?
解执行NEGCH后,CH为(-26)补,CH=(-26)补=11100110B=E6H。
【例3-23】已知CH=E6H=11010110B=-26,执行NEGCH后,CH=?
解执行NEGCH后,CH为(+26)补,CH=(+26)补=00011010B=1AH。5)比较指令CMP
格式:CMPDST,SRC
功能:DST-SRC。不送结果,仅置标志位,可进行8/16位二进制数比较,对于目的操作数和源操作数的限制以及指令的5种类型都同于SUB指令。比如立即数不能作被减数,两存储单元数不能比较。以下是根据标志位判断两数大小的一些做法:
两个无符号数相减,用CF判断:CF=0表示被减数大;CF=1表示减数大。
两个有符号数相减,由OF⊕SF判断:OF⊕SF=0表示DST≥SRC;OF⊕SF=1表示DST<SRC。无论有符号数还是无符号数,若ZF=1则表示DST=SRC;ZF=0则表示DST≠SRC。【例3-24】给下列程序作注解。CMPCOUNT[SI],CX ;内存(DS×10H+SI+COUNT)-CXJNZLONG ;上述运算结果不为0时,转LONGMOVDX,AX ;CMP运算结果为0时,执行下一条指令
3.乘法指令
1)无符号数乘法指令格式:MULSRC
功能:实现两个8/16位无符号二进制数相乘,一个乘数因子是AL/AX,另一个是SRC,SRC为8/16位通用寄存器或存储器操作数。1、8位数相乘时,执行AX←AL×SRC,16位乘积送入AX中;2、16位数相乘时,执行DX:AX←AX×SRC,32位乘积的高16位送入DX,低16位送入AX。当运算结果使高位字节AH≠0(8位乘)或高位字DX≠0(16位乘)时,标志位CF、OF均为1,其余标志位任意。【例3-25】已知AX=AB12H,DS=6000H,BX=789AH,(6789CH)=66H,执行MULBYTEPTR[BX+02H]后,AX=?DS=?BX=?标志位=?
解
AX=12H×66H=072CH,DS、BX不变。OF=CF=1,SF、ZF、AF、PF任意。2)有符号数乘法指令
格式:IMULSRC
功能:除符号位外,IMUL其余与MUL指令相同。相乘方法是:将参加运算的操作数变为原码,符号位与符号位相乘,数值位与数值位相乘,给乘积赋予正确的符号,并变为补码,就是最终结果。当AH为AL的符号位扩展,即AH=00H或AH=FFH时,OF=CF=0,否则OF=CF=1,其余标志位任意。【例3-26】设AX=00FEH,CH=11H,执行IMULCH后,AX=?CH=?
解设AL=FEH为(X)补,X=-2,CH=11H=(+17)补,符号位运算得-1,数值位运算得34,配上符号(-1),求得AX=(-34)补=FFDEH,CH不变,AH由AL符号位扩展而得,OF=CF=0。4.除法指令
除法指令包括无符号数除法指令DIV、有符号数除法指令IDIV、扩展指令CBW和CWD共3种。要求:被除数为除数字长的两倍。它们所在的位置如下:
除数为0位时,产生类型0中断。类型0中断的过程为:①FLAGS入栈;②IF和TF清0;③CS、IP入栈;④内存(0000H)→IP,(0002H)→CS;⑤进入中断服务程序。1)无符号数除法指令
格式:DIVSRC
功能:=AL余AH; =AX余DX。SRC为8/16位通用寄存器或存储器操作数。2)有符号数除法指令IDIV
有符号数除法指令IDIV的格式和功能同于DIV。被除数、除数、商数和余数都是有符号数,最高位为符号位,做除法时应化补码为原码,用真值算。例如设AX=1500H,[BX+SI]=22H,执行指令DIVBYTEPTR[BX+SI],有AX/(BX+SI)=1500H/22H=5376/34=158余4,结果AX=049EH。当遇到被除数和除数的符号不同时,要求余数符号与被除数符号相同。例如设AX=FFDDH=(-35)补,CH=06H=(+6)补,除法(-35)÷6的结果有两个:一个是商-6余+1,一个是商-5余-5。执行IDIVCH,微机内得到后一个结果。商AL=(-5)补=FBH,余数AH=(-5)补=FBH。如果除数是8位(16位),而被除数也只有8位(16位)字节(字)数据,并且放在AL(AX)中,那么应当将8位(16位)字节(字)数据进行符号位扩展,从AL(AX)扩展到AX(DX:AX),使其成为16位(32位)数据,再做除法。字节除法商的范围为-128~+127,字除法商的范围为-32768~+32767。商超出此范围时当作除数为0处理,内部产生一个类型0中断。3)扩展指令CBW和CWD
这两条指令不影响标志位。
CBW的功能是将AL的符号位扩展到AH中,将字节扩展为字。当AL<80H时,扩展后AH=00H;当AL≥80H时,扩展后AH=FFH。CWD的功能是将AX的符号位扩展到DX中,将字扩展成双字。当AX<8000H时,扩展后DX=0000H;当AX≥8000H时,扩展后DX=FFFFH。5.十进制调整指令
十进制调整指令有6条,对用组合BCD码、未组合BCD码及ASCII码表示的数算术运算后调整。
1)组合BCD码加法十进制调整指令DAA
DAA位于ADD和ADC指令后。功能:若ADD或ADC指令运算后,使AL低4位>1001B或AF=1,则AL+06H→AL且使CF=1;若ADD或ADC指令运算后,使AL高4位>1001B或CF=1,则AL+60H→AL且使CF=1。
2)未组合BCD码加法十进制调整指令AAA
AAA也称为ASCII码调整指令,接在ADD或ADC之后。功能:若ADD或ADC指令使AL低4位>1001或AF=1,则AL+06H→AL,且使AF=1,AH+1→AH;执行AL←AL∧0FH,即将AL高4位清0,CF←AF。如果ADD或ADC指令使AL低4位≤1001且AF=0,则直接执行上述后两步,此时AF=0。
3)组合BCD码减法的十进制调整指令DAS
DAS接在SUB或SBB指令中。功能:对AL中的运算结果调整。方法:若AL低4位>1001或AF=1,则进行AL-06H→AL,且使AF=1;若AL高4位>1001或CF=1,则进行AL-60H→AL,且使CF=1。
DAS指令对OF无影响,对其余5个标志位有影响。
【例3-27】设AL=60H=01100000B,AH=21H=00100001B,则执行SUBAL,AHDAS后,AL=?
解
SUBAL,AH的执行结果为AL=3FH。DAS执行完后,AL=39H,OF=0,AF=1。若事先存放在AL和AH中的是BCD码,则DAS后AL中也是BCD码。
4)未组合BCD码减法的十进制调整指令AAS
AAS也称为减法的ASCII码调整指令,要求参加SUB、SBB运算的两个数是未组合BCD或ASCII码,在SUB或SBB指令(一定以AL为目的)后执行。功能:①若AL低4位>1001或AF=1,则AL-6→AL,AH-1→AH,且使AF=1;②AL←AL∧0FH,即将AL高4位清0;③CF←AF。【例3-28】设AX=0103H,BL=06H,则执行SUBAL,BLAAS后的结果如何?
解第1条指令执行后AL=11111101B;第2条指令执行后,AX=0007H,CF=1,AF=1,BL=06H。
5)未组合BCD码乘法的十进制调整指令AAM
AAM也称为乘法的ASCII码调整指令,在MUL指令后执行。参加MUL相乘的两个数应当是高4位为0的8位未组合BCD码。功能:AL÷0AH后,商→AH,余数→AL。
【例3-29】AL和BL为两个未组合BCD码,AL=08H,BL=07H。执行MULBL后,AX=0038H。执行AAM后,AX=0506H,表示十进制数8×7=56,影响PF、SF、ZF标志。
6)未组合BCD码除法的十进制调整指令AAD
AAD也称为除法的ASCII码调整指令,在DIV指令之前进行。参加DIV除法运算的3个8位数(位于AH、AL和DIV指令指出的源操作数)都应为未组合BCD码。
功能:将AX中的未组合BCD码(两位十进制数,十位数在AH中,个位数在AL中)变成二进制数,并放入AL。【例3-30】设AX=0607H,即AH=06H,AL=07H,BL=02H,则执行AADDIVBL;后的结果如何?
解第1条指令执行后,AX=0043H=67,PF=0(AL中奇数个1),SF=0,ZF=0;第2条指令执行后,AX=0121H(AH=01为余数,AL=33为商),对标志位无影响。(运算结果为二进制数)3.4.3逻辑运算和移位循环指令表3-10逻辑运算和移位循环指令1.逻辑运算指令
1)逻辑“与”指令AND
格式:ANDDST,SRC
功能:DST←DST∧SRC。目的操作数限于使用8/16位通用寄存器、存储单元,源操作数允许使用8/16位通用寄存器、存储单元和立即数,但目的操作数和源操作数不允许同时为存储器操作数。指令影响PF、SF和ZF标志位,且使CF=0,OF=0,不影响AF。【例3-31】ANDAL,AL有什么作用?
解功能为AL∧AL→AL,所以AL内容维持不变。
使标志位CF清零。
2)逻辑“或”指令OR
格式:ORDST,SRC
功能:DST←DST˅SRC。对DST和SRC按位相或,其限制及标志位影响同于“与”指令。
【例3-32】ORAL,80H的作用为将AL的D7位置1。3)逻辑“异或”指令XOR
格式:XORDST,SRC
功能:DST←DST⊕SRC。对DST和SRC的限制及标志位影响同于“与”指令。XOR可用于使寄存器清零。如XORBX,BX能使BX=0000H。
【例3-33】编程使某存储单元(位于DS段,用BX寻址)清零,要求使用异或指令。
解因为XOR[BX],[BX]是非法的,所以程序如下:XORAX,AXMOVWORDPTR[BX],AX4)求反指令NOT
格式:NOTDST
功能:DST←DST,将DST所有位逐位求反。DST为8/16位通用或存储器操作数。
【例3-36】设AX=0100000010000110B=4086H,则执行NOTAX后,AX=BF79H。
【例3-37】写出两条使DI→DI的指令。
解
NOTDI;XORDI,0FFH。5)测试指令TEST
格式:TESTDST,SRC
功能:DST∧SRC。相“与”后不送结果,仅影响标志位。对标志位影响同于“与”。
【例3-38】指令TESTAL,02H用于测试AL的D1位,若该位为0,则ZF=1,否则ZF=0。【例3-34】写出5条能使SI清零的指令。
解
XORSI,SI;MOVSI,0000H;ANDSI,0000H;LEASI,[0000H];SUBSI,SI。
【例3-35】写出5条能使CF清零但又不影响寄存器内容的指令。
解
ANDAX,AX;ORAX,AX;XORAX,00H;TESTAX,00H;TESTAX,AX。2.移位指令移位指令有4条,分别是算术左移SAL(ShiftArithmeticLeft)、算术右移SAR(ShiftArithmeticRight)、逻辑左移SHL(ShiftLogicLeft)和逻辑右移SHR(ShiftLogicRight)。4条指令有完全相同的格式,指令中的目的操作数REG/MEM限于使用8/16位通用寄存器和存储器;源操作数CNT是移位次数,限于CL或1,最多能移255位。4条指令对标志位的影响也相同,除AF任意外,操作结果影响CF、PF、ZF、SF和OF。移位指令的操作功能如图3-12所示。算术左移和逻辑左移的操作结果完全相同。算术右移可保持目的操作数的符号位不变,因此常用于有符号数移位。算术左(右)移n位,相当于把二进制数乘以(除以)2n。逻辑右移时,目的操作数最高位补0,可用于截取字节或字中某些位。图5-12移位指令(a)算术左移;(b)算术右移;(c)逻辑左移;(d)逻辑右移【例3-39】设执行前BL=75H,CL=03H,求指令SALBL,CL的执行结果。
解
BL内容算术左移3位:【例3-40】下面两段程序均能完成X×10的运算,X在AL中,比较它们的执行时间。程序1: MULCL ;设CL=0AH,查表需时最少70T
程序2: SALAL,1 ;左移1位,X×2,查表需时2T
MOVBL,AL;暂存X×2,查表需时2T
SALAL,1 ;左移1位,X×4,查表需时2T
SALAL,1 ;左移1位,X×8,查表需时2T
ADDAL,BL;X×8+X×2=X×10,查表需时 3T,共需时11T
3.循环指令循环指令有4条,如图5-13所示,分别是:不含进位位的循环左移指令ROL(RotateLeft);不含进位位的循环右移指令ROR(RotateRight);包含进位位的循环左移指令RCL(RotatethroughCFLeft);包含进位位的循环右移指令RCR(RotatethroughCFRight)。图5-13循环指令(a)不含进位位的循环左移;(b)不含进位位的循环右移;(c)包含进位位的循环左移;(d)包含进位位的循环右移
循环指令可以分成不含进位位的循环和包含进位位的循环两类,每一类又有左移、右移两种。不含进位位时,仅有目的操作数进行循环操作;包含进位位时,CF位于循环圈内。循环虽然也是一种移位,但循环指令和移位指令的明显区别是:循环移位是一种闭环移位,移出的目的操作数某一位并不丢失,而是移到另一端。循环指令又称为循环移位指令,而移位指令又称为非循环移位指令。循环指令的移位格式、对目的操作数和源操作数的要求完全同于移位指令,但它们只影响CF和OF标志位,不影响其它标志位。5.4.4串操作指令所谓“字符串”是指一个数据块或多个字符的集合,简称“串”。微机经常要对字符串执行一些诸如计算串长度、查找关键字、修改字符参数、判断两个串是否相同等操作,这些操作统称为“串操作”。使用串操作指令能够方便地完成8/16位数据串或字符串的传送、比较、搜索、读和写。串操作指令如表3-11所示,分成重复前缀和字符串操作两类。这些指令是指令系统中惟一一组能直接处理源和目的操作数都在存储器内的指令。每次串操作后,存放操作数偏移地址的SI和DI内容将自动修改。如果用CLD指令使方向标志DF=0,则修改时SI和DI按增量修改(字节操作加1,字操作加2);如果用STD指令使DF=1,则减量修改。串操作指令采用隐含寻址方式(源操作数起址为DS:SI,目的操作数起址为ES:DI),字符串长度存放于CX中,被处理的长度最长达64KB。串操作指令前可以加重复前缀指令,使串操作指令重复进行,直至CX=0为止。每一种串操作指令格式虽有3种,但因采取隐含寻址,故指令只需写出助记符即可。表3-11串操作指令表3-11串操作指令1.重复前缀指令重复前缀指令有3条,不能单独使用。
1)无条件重复前缀REP
用途:用于任一条串操作指令前,使指令执行到CX=0为止。
2)当相等/为0时重复前缀REPE/REPZ
用途:常与串比较指令CMPS连用,比较的两数不相等时,使指令执行到Z=0(比较的两数不相等)或CX=0(所有的数比较完毕)为止。
3)当不等/不为0时重复前缀REPNE/REPNZ
用途:常与串搜索SCAS指令连用,使指令执行到Z=1或CX=1为止。
2.基本字符串指令基本字符串指令有5条。
1)串传送(MoveString)
格式:MOVS目的串,源串
MOVSB/MOVSW
功能:将源串(DS:SI)所指存储单元内容传送到目的串(ES:DI)所指存储单元,传送后SI、DI将自动修改。指令不影响标志位。MOVSB用于传送一个字节,MOVSW用于传送一个字。指令的基本格式是MOVS,但需指明是字节传送还是字传送,例如
MOVSBLOAK1,BLOAK2指令在使用前就应先定义BLOAK1和BLOAK2是字节数据还是字数据,并且BLOAK1一定要在附加段中,BLOAK2一定要在数据段中。有了事先的说明后,汇编程序就能根据操作数的属性自动判断,才不会出差错。MOVSB和MOVSW是MOVS的替代符,由于指令助记符已用“B”、“W”标明是字节数据或字数据,因此不再需要操作数。其它基本字符串指令都可以使用替代符,使编程方便又不易出错。【例3-41】将1000H:2000H地址开始的100个字节数传送到3000H:4000H开始的单元中。
MOV AX,1000H
MOV DS,AX ;设立DS段首址
MOV AX,3000H
MOV ES,AX ;设立ES段首址
MOV SI,2000H ;送源串首址偏移量
MOV DI,4000H ;送目的首址偏移量
MOV CX,064H ;送串长度
CLD ;置DF←0,使SI、DI按增量方向修改NEXT:MOVSB;将(DS:DX)1个字节传送到(ES:DI),SI、DI各自动加1
DECCX;CX减1
JNZNEXT;64H个字节未传送完,转NEXT继续传送,直至传送完,退出【例3-42】上例程序如果使用重复前缀REP,则可取代哪些语句?答上例最后3条指令可以用一条指令REPMOVSB代替。
【例3-43】上例程序能否使用MOVSW实现?答可以,前6条设置段首址、偏移量指令相同,第7条指令以后修改如下:
MOV CX,50;送串长度
CLD ;置DF←0,使SI、DI按增量方向修改NEXT:MOVSW ;传送1个字,SI、DI各自动加2
DEC CX ;CX减1
JNZ NEXT ;50个字未传送完,转NEXT继续传送,直至传送完,退出2)串比较(CompareString)
格式:CMPS源串,目的串
CMPSB/CMPSW
功能:将源串(DS:SI)所指存储单元内容减去目的串(ES:DI)所指存储单元内容,但不送结果,仅置标志位(OSZAPC位),并使SI、DI自动修改指向下一单元。CMPSB用于比较一个字节,CMPSW用于比较一个字。常和重复前缀REPE/REPZ使用。串比较指令的几种格式中,常用替代符CMPSB(字节比较)和CMPSW(字比较),如果要用CMPS这种形式,与MOVS指令一样,要事先对操作数说明。此外特别要注意的是:本条指令“源操作数”在前,“目的操作数”在后,这是80X86指令系统中的惟一一个例外,其它两操作数指令都是“目的操作数”在前,“源操作数”在后,编程时要格外当心。为防止疏忽出错,最好使用替代符。【例3-44】比较两个数据
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业机械应用技术专业评估
- 贷款担保合作协议范本
- 2026年湖南生物机电职业技术学院单招职业技能测试必刷测试卷附答案
- 2026年三门峡职业技术学院单招职业倾向性测试必刷测试卷及答案1套
- 2026年云南省临沧地区单招职业适应性考试必刷测试卷及答案1套
- 2026年云南商务职业学院单招综合素质考试必刷测试卷及答案1套
- 2026年开封职业学院单招综合素质考试题库新版
- 2026年青海省海东地区单招职业适应性考试题库新版
- 2026年湖南电气职业技术学院单招职业倾向性测试题库必考题
- 2026年白城职业技术学院单招综合素质考试必刷测试卷及答案1套
- 围墙粉刷施工方案(3篇)
- 2025山东泰山财产保险股份有限公司总公司及分支机构校园招聘、社会招聘笔试备考试题及答案解析
- 数控技术专业介绍
- 2025至2030中国黑龙江省养老机构行业产业运行态势及投资规划深度研究报告
- “华能工匠杯”电力市场交易技能竞赛考试题库(附答案)
- 吸引力法则培训课件
- 做课件教学的步骤
- 2025年饮料gmp试题及答案
- 低碳景观设计策略-洞察及研究
- 局工作秘密管理暂行办法
- 《“1+X”无人机摄影测量》课件-项目三 像控点采集
评论
0/150
提交评论