《计算机组成原理》-第5章_第1页
《计算机组成原理》-第5章_第2页
《计算机组成原理》-第5章_第3页
《计算机组成原理》-第5章_第4页
《计算机组成原理》-第5章_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

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

文档简介

第5章指令系统5.18088/8086的寻址方式5.2指令系统返回5.18088/8086的寻址方式计算机的指令通常包含操作码和操作数两部分,操作码指出操作的性质,操作数给出操作的对象。指令执行时寻找操作数地址的过程称为寻址;寻找操作数存放地址的各种方式称为寻址方式。指令有单操作数、双操作数和无操作数之分。如果是双操作数指令,要用逗号将两个操作数分开,逗号右边的操作数称为源操作数,左边的为目的操作数。8088/8086系统中的操作数有7种寻址方式。分别是立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式和基址变址相对寻址方式。下面主要以MOV指令为例来说明8086指令的各种寻址方式。下一页返回5.18088/8086的寻址方式5.1.1立即寻址方式在立即寻址(ImmediateAddressing)方式下,操作数直接包含在指令中,它是一个8位或16位的常数,也叫立即数。这类指令翻译成机器码时,立即数作为指令的一部分,紧跟在操作码之后,存放在代码段内。如果立即数是16位数,则高字节存放在代码段的高地址单元中,低字节存放在低地址单元中。立即寻址方式的指令常用来给寄存器赋初值。5.1.2寄存器寻址方式在寄存器寻址(RegisterAddressing)方式下,操作数包含在寄存器中,由指令指定寄存器的名称。上一页下一页返回5.18088/8086的寻址方式对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP和BP等;对于8位操作数,则用寄存器AH,AL,BH,BL,CH,CL,DH和DL。在7种寻址方式中,除了立即寻址方式和寄存器寻址方式外,在以下五种寻址方式指令的操作数都放在存储器中,需要使用不同的方法求出操作数的物理地址,来获得操作数。存储器操作数存放的地址本来应该是物理地址,但为了书写方便,一般采用有效地址EA(或称有效地址)来代替物理地址,段地址以隐含方式给出,假如偏移地址是X,该地址中的内容为Y,则表示为(X)=Y,即用括号将偏移地址括起来表示该地址的内容。上一页下一页返回5.18088/8086的寻址方式5.1.3直接寻址方式1.直接寻址方式把操作数的偏移地址称为有效地址EA。指令中的操作数使用直接寻址(DirectAddressing)方式时,存储单元的有效地址直接由指令给出,指令中有效地址上必须加一个方括号,以便与立即数相区别。在指令的机器码中,有效地址存放在代码段中指令的操作码之后;而实际运行的数据则存放在存储器中,因此必须先求出操作数的物理地址,然后再访问存储器,才能取得操作数。需要注意的是,当采用直接寻址指令时,默认为使用的段寄存器为数据段寄存器DS,因此操作数的物理地址=16×DS+EA。上一页下一页返回5.18088/8086的寻址方式2.段超越前缀如果要对代码段、堆栈段或附加段寄存器所指出的存储区进行直接寻址,应在指令中指定段超越前缀。例如,数据若放在附加段中,则应在有效地址前加“ES:”,这里的冒号“:”称为修改属性运算符。计算物理地址时,要用ES作基地址,而不再是默认值DS。3.符号地址在汇编语言中还允许用符号地址代替数值地址,实际上就是给存储单元起一个名字,那么如果使用这些单元中的数据时,直接使用其名字即可,而不必记住具体数值。上一页下一页返回5.18088/8086的寻址方式5.1.4寄存器间接寻址方式若指令中给出的寄存器中的值不是操作数本身,而是操作数的有效地址,这种寻址方式称为寄存器间接寻址(RegisterIndirectAddressing)。此时寄存器名称外面必须加方括号,以与寄存器寻址方式相区别。能够用来间接寻址的寄存器只能是寄存器SI,DI,BP,BX其中之一,其中BX,BP称为基址寄存器,SI,DI称为变址寄存器。寄存器间接寻址方式中,寄存器的内容为操作数的偏移地址EA,而操作数存放在存储器中。上一页下一页返回5.18088/8086的寻址方式若指令中指定的寄存器是BX,DI或SI,则操作数在当前数据段中,所以操作数的物理地址EA的形成是由数据段寄存器DS的内容左移4位,加上BX,DI或SI中的偏移地址EA。若指令中指定的寄存器是BP,则操作数在当前堆栈段中,所以操作数的物理地址EA的形成是堆栈段寄存器SS的内容左移4位,加上BP中的偏移地址EA形成操作数的物理地址EA,如图5-3寄存器间接寻址所示。5.1.5寄存器相对寻址方式上一页下一页返回5.18088/8086的寻址方式操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量(Displacement)之和,则将操作数的寻址方式称为寄存器相对寻址(RegisterRelativeAddressing)。寄存器相对寻址方式与寄存器间接寻址十分相似,主要区别是前者在有效地址上还要加一个位移量。同样,当指令中指定的寄存器是BX、SI或DI时,段寄存器使用DS,当指定寄存器是BP时,段寄存器使用SS。5.1.6基址变址寻址方式基址变址寻址(BasedIndexedAddressing)方式的操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和,两个寄存器均由指令指定。上一页下一页返回5.18088/8086的寻址方式若基址寄存器为BX时,段址寄存器用DS,则物理地址=16×DS+BX+SI=16×DS+BX+DI若基址寄存器为BP时,段址寄存器应用SS,则5.1.7基址变址相对寻址方式相对基址变址寻址(RelativeBasedIndexedAddressing)方式的操作数的有效地址是一个基址寄存器和一个变址寄存器的内容,再加上指令中指定的8位或16位位移量之和。上一页下一页返回5.18088/8086的寻址方式若基址寄存器为BX时,用DS作段寄存器,则物理地址=16×DS+BX+SI+8位或16位位移量或=16×DS+BX+DI+8位或16位位移量若基址寄存器为BP时,应用SS作段寄存器,则物理地址=16×SS+BP+SI+8位或16位位移量或=16×SS+BP+DI+8位或16位位移量。对于MOV指令来讲,当源操作数用存储器方式寻址时,不仅要求出源操作数的地址,还要将该地址中的内容取出来,作为源操作数,再送到目的操作数中去。而当目的操作数用存储器方式寻址时,只要求出目的操作数的物理地址,就可将源操作数送到这个地址中去。对于寄存器作源操作数,或目的操作数时,情况也是类似的。上一页返回5.2指令系统8088/8086CPU指令系统可以分为:数据传送指令、算术运算指令、逻辑运算指令、移位指令、转移指令、字符串操作指令、处理器控制指令、输入/输出指令、中断指令。5.2.1数据传送指令数据传送指令用来实现寄存器和存储器间的字节或字的数据传送。其中包括堆栈操作、地址传送等指令。具体指令见表5-1。1.数据传送指令MOV格式:MOVDST,SRC源操作数(SRC)可以是累加器、寄存器、存储单元以及立即数,而目的操作数(DST)可以是累加器、寄存器和存储单元,不能是立即数。传送操作不改变源操作数。下一页返回5.2指令系统数据传送指令能实现下列传送功能:(1)CPU内部寄存器之间的数据传送(2)立即数送至通用寄存器或存储单元(3)寄存器与存储器间的数据传送2.交换指令XCHG格式:XCHGDST,SRC此指令把操作数DST的内容与操作数SRC的内容交换。操作数同时是字节或字。上一页下一页返回5.2指令系统3.地址传送指令(1)传送偏移地址指令LEA格式:指令LEA称为传送有效地址指令。该指令把源操作数SRC的有效地址传送到目的操作数DST。源操作数SRC必须是一个存储器操作数,操作数DST必须是一个16位的通用寄存器。(2)传送32位地址指针指令LDS格式:上一页下一页返回5.2指令系统该指令把操作数SRC中所含的一个32位地址指针的段值部分送到数据段寄存器DS,把偏移部分送到指令给出的通用寄存器DST。操作数SRC必须是一个32位的存储器操作数,操作数SRC是一个16位的通用寄存器,实际使用通常是变址寄存器或指针寄存器。该指令传送32位地址指针。执行的操作:(3)传送32位地址指针指令LE格式:上一页下一页返回5.2指令系统指令LES也传送32位地址指针,该指令把源操作数SRC中所含的32位地址指针的段值部分送到附加段寄存器ES,把偏移部分送到指令给出的通用寄存器DST。执行的操作:4.堆栈操作指令在8086/8088系统中,堆栈是一段RAM区域。称为栈底的一端地址较大(高地址),称为栈顶的一端地址较小(低地址)。堆栈的段值在堆栈段寄存器SS中,堆栈指针寄存器SP始终指向栈顶。堆栈是以“后进先出”方式工作的一个存储区。上一页下一页返回5.2指令系统堆栈的存取必须以字为单位。堆栈操作指令分为两种:(1)进栈指令PUSH格式:该指令把源操作数SRC压入堆栈。它先把堆栈指针寄存器SP的值减2,然后把源操作数SRC送入由SP所指的栈顶。源操作数SRC可以是通用寄存器和段寄存器,也可以是字存储单元。执行的操作:①(SP)←(SP)-2②将SRC数据存入SP所指定的单元(2)出栈指令POP上一页下一页返回5.2指令系统格式:POPDST该指令从栈顶弹出一个字数据到目的操作数DST。它先把堆栈指针寄存器SP所指的字数据送至目的的操作数DST,然后SP值加2。执行的操作:①将SP所指字数据取出,传送到目的操作数DST。②(SP)←(SP)+2。5.标志操作指令(1)指令LAHF格式:LAHF上一页下一页返回5.2指令系统该条指令把标志寄存器的低8位(包括SF、ZF、AF、PF和CF)传送到寄存器AH的指定位。(2)指令SAHF格式:SAHF该条指令与LAHF刚好相反,把寄存器AH的指定位送至标志寄存器低8位的SF、ZF、AF、PE和CF标志位。在FLAG标志位中:0位是CF;2位是PF;4位是AF;6位是ZF;7位是SF;8位是TF;9位是IF;10位是DF;11位是OF。(3)指令PUSHF格式:PUSHF上一页下一页返回5.2指令系统该条指令把标志寄存器的内容压入堆栈,即先把堆栈指针寄存器SP的值减2,然后把标志寄存器的内容送入由SP所指的栈顶。(4)指令POPF格式:POPF该条指令把当前堆栈顶的一个字传送到标志寄存器,同时相应地修改堆栈指针,即把堆栈指针寄存器SP的值加2。这条指令和PUSHF指令一起可以保存和恢复标志寄存器的内容,即保存和恢复各标志的值。另外,这两条指令也可以用来改变追踪标志TF。上一页下一页返回5.2指令系统5.2.2加减运算指令算数运算类指令包括加法类指令、减法类指令、乘法指令、除法指令以及十进制调整指令。具体指令见表5-2算术运算类指令。1.加法指令(1)常规加法指令ADD格式:执行的操作:(DST)←(DST)+(SRC)(2)带进位加指令ADC格式:上一页下一页返回5.2指令系统执行的操作:(DST)←(DST)+(SRC)+(CF)(3)加1指令INC格式:这条指令完成对操作数OPRD加1,然后把结果送回OPRD,即(DST)←(DST)+1操作数OPRD可以是通用寄存器,也可以是存储单元。这条指令执行的结果影响标志ZF、SF、OF、PF和AF,但它不影响CF。该指令主要用于调整地址指针和计数器。2.减法指令上一页下一页返回5.2指令系统(1)常规减法指令SUB格式:执行的操作:(DST)←(DST)-(SRC)加法指令影响标志位CF位说明无符号数相减的溢出,同时它又是被减数的最高有效位向高位的借位值。OF位则说明带符号数的溢出。减法的OF位的设置方法为:若两个数的符号相反,而结果的符号与减数相同,则OF=1,那么说明结果是错误的。(2)带借位减指令SBB格式:上一页下一页返回5.2指令系统执行的操作:(OPRD1)←(OPRD1)-(OPRD2)-CF指令与加法指令ADC主要用于多字节数相减的场合,一般不会单独使用。(3)减1指令DEC格式:执行的操作:(DST)←(DST)-1(4)取补指令NEG格式:上一页下一页返回5.2指令系统执行的操作:(OPRD)←0-(OPRD)这条指令对操作数取补,就是用零减去操作数OPRD,再把结果送回OPRD(各位取反末尾加1)。操作数可以是通用寄存器,也可以是存储单元。(5)比较指令CMP格式:指令完成操作:DST-SRC运算结果不送到DST,但影响标志CF、ZF、SF、OF、AF和PF。比较指令主要用于比较两个数的关系,是否相等以及大小关系。上一页下一页返回5.2指令系统在减法操作后,如果源操作数大于目的操作数,需要借位时,进位借位标志CF将被置1。执行了比较指令后,可根据ZF是否置位,判断两者是否相等;如果两者是无符号数,则可根据CF判断大小;如果两者是有符号数,则要根据SF和OF判断大小。常用这条指令来比较两个串是否相同,并由加在CMPS指令后的一条条件转移指令,根据CMPS执行后的标志位值决定程序的转向。5.2.3乘除运算指令乘除运算指令分为无符号数运算和有符号数运算指令,这点与加减法运算指令不同。乘除运算指令对标志位的影响有些特别。1.乘法指令上一页下一页返回5.2指令系统在乘法指令中,一个操作数总是隐含在寄存器AL(8位数相乘)或者AX(16位数相乘)中,另一个操作数可以采用除立即数方式以外的任一种寻址方式。(1)无符号数乘法指令MUL格式:指令功能:把源操作数和累加器中的数都当成无符号数,然后将两数相乘,源操作数可以是字节或字。如果源操作数是一个字节,它与累加器AL中的内容相乘,乘积为双倍长的16位数,高8位送到AH,低8位送AL。即AX←AL×SRC上一页下一页返回5.2指令系统如果源操作数是一个字,则它与累加器AX的内容相乘,结果为32位数,高位字放在DX寄存器中,低位字放在AX寄存器中。即乘法指令中,源操作数可以是寄存器,也可以是存储单元,但不能是立即数。当源操作数是存储单元时,必须在操作数前加B或W说明是字节还是字。MUL指令对状态标志位CF、OF有影响,对SF、ZF、AF、PF的影响不确定。上一页下一页返回5.2指令系统两个8位数相乘,乘积可能有16位,结果存放在AX中;两个16位数相乘,乘积可能有32位,存放在DX高16位,AX低16位,如果运算结果高位(AH或DX)为零,则状态标志位CF=OF=0,否则CF=OF=1,此时表示AH或DX中包含乘积的有效位。(2)有符号数乘法指令IMUL上一页下一页返回5.2指令系统格式:这条指令把被乘数和乘数均作为有符号数,其余与指令MUL完全类似。如果乘积结果的高半部分(字节相乘时为AH,字相乘时为DX)不是低半部分的符号扩展,则标志CF=1,OF=1;否则CF=0,OF=0。所以如果CF=1和OF=1表示在AH或DX中含有结果的有效数。该指令对其他标志位无定义。2.除法指令在除法指令中,被除数总是隐含在寄存器AX(除数是8位)或者DX和AX(除数是16位)中,如图5-12所示,另一个操作数可以采用除立即数方式外的任一种寻址方式。上一页下一页返回5.2指令系统(1)无符号数除法指令DI格式:字节操作表示为:(AL)←(AX)/(OPRD)的商;(AH)←(AX)/(OPRD)的余数字操作表示为:(AX)←(DX,AX)/(OPRD)的商;(DX)←(DX,AX)/(OPRD)的余数如果除数为0,或者在8位数除时商超过8位,或者在16位除时商超过16位,则认为是除溢出,引起0号中断。除法指令对标志位的影响无定义。上一页下一页返回5.2指令系统对于无符号数,字节操作时,允许最大商为0FFH,字操作时最大商为0FFFFH,若超过这个范围,就会溢出。(2)有符号数除法指令IDIV格式:这条指令把被除数和除数均作为有符号数,其余与指令DIV完全类似。对于带符号数,字节操作时商的范围为-128~+127;字操作时商的范围为-32767~+32767。3.符号扩展指令由于除法指令隐含使用字被除数或双字被除数,所以当被除数为字节,或者除数和被除数均为字时,需要在除操作前扩展被除数。上一页下一页返回5.2指令系统为此,8086/8088专门提供了符号扩展指令。(1)字节转换为字指令CBW格式:CBW这条指令把寄存器AL中的符号扩展到寄存器AH。(2)字转换为双字指令CWD格式:CWD这条指令把寄存器AX中的符号扩展到寄存器DX。5.2.4逻辑运算和移位指令上一页下一页返回5.2指令系统8086/8088逻辑运算指令有AND逻辑“与”、TEST测试、OR逻辑“或”、XOR逻辑“异或”、NOT逻辑“非”运算。各种逻辑运算的结果见表5-3。1.逻辑运算指令(1)非操作指令NOT格式:这条指令把操作数DST取反,然后送回DST。操作数DST可以是通用寄存器,也可以是存储器操作数,不能是立即数。此指令对标志位没有影响。(2)与操作指令AND上一页下一页返回5.2指令系统格式:这条指令对两个操作数进行按位的逻辑“与”运算,结果送到目的操作数DST。该指令执行以后,标志CF=0,标志OF=0,标志PF、ZF、SF反映运算结果,标志AF未定义。某个操作数自己与自己相“与”,则值不变,但可使进位标志CF清0。与操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位清为0的场合。(3)或操作指令OR格式:上一页下一页返回5.2指令系统这条指令执行以后,标志CF=0,标志OF=0,标志PF、ZF、SF反映运算结果,标志AF未定义。某个操作数自己与自己相“或”,则值不变,但可使进位标志CF清0。对于“或”运算:两个操作数中有一个是1的,结果为1,其他情况全是0。或操作指令主要用于在使一个操作数中的若干位维持不变,而另外若干位置为1的场合。把要维持不变的这些位于“0”相“或”,而把要置为1的这些位于“1”相“或”就能达到这样的目的。(4)异或操作指令XOR格式:上一页下一页返回5.2指令系统“异或”运算的规则是:两个操作数,一个是0,一个是1,则为1;两个都为1,则为0;两个都为0,则为0。这条指令对两个操作数进行按位的逻辑“异或”运算,结果送到目的操作数OPRD1。该指令执行以后,标志CF=0,标志OF=0,标志PF、ZF、SF反映运算结果,标志AF未定义。某个操作数自己与自己相“异或”,则结果为0,并可使进位标志CF清0。异或操作指令主要用于在使一个操作数中的若干位维持不变,而另外若干位置取反的场合。把要维持不变的这些位于“0”相“异或”,而把要取反的这些位于“1”相“异或”就能达到目的。上一页下一页返回5.2指令系统(5)测试指令TEST格式:TEST指令和AND指令类似,把两个操作数进行按位“与”,但结果不送到操作数DST。该指令执行以后,标志ZF、PF和SF反映运算结果,标志CF和OF被清0。该指令通常用于检测某些位是否为1,但又不希望改变原操作数值的场合。2.移位指令8086/8088指令系统的移位指令包括逻辑左移SHL、算术左移SAL、逻辑右移SHR、算术右移SAR,还有循环移位指令,包括不带进位循环左移ROL、循环右移ROR和带进位循环左移RCL、循环右移RCR。移位常数一定放在CL中。上一页下一页返回5.2指令系统移位指令都影响状态标志位,但影响的方式各条指令不尽相同。(1)算术左移或逻辑左移指令SAL/SHL算术左移和逻辑左移进行相同的动作,尽管为了方便提供有两个助记符,但只有一条机器指令。格式:算术左移SAL(有符号数)/逻辑左移SHL(无符号数)指令把操作数DST左移1次或多次,次数在寄存器CL中,每移动一位,右边用0补足一位,移出的最高位进入标志位CF,如图5-13所示。上一页下一页返回5.2指令系统(2)算术右移指令SAR格式:或者该指令使操作数右移m位,同时每移一位,左边的符号位保持不变,移出的最低位进入标志位CF,如图5-14所示。(3)逻辑右移指令SHR格式:该指令使操作数右移m位,同时每移一位,左边用0补足,移出的最低位进入标志位CF,如图5-15所示。对于无符号数而言,逻辑右移一位相当于除以2。上一页下一页返回5.2指令系统在汇编语言程序设计中,经常需要对以位为单位的数据进行合并和分解处理。一般通过移位指令和逻辑运算指令进行这种数据的合并和分解处理。3.循环移位指令8086/8088指令系统有四条循环移位指令,即不带进位标志CF的左循环移位指令ROL和右循环移位指令ROR(也称小循环),以及带进位标志CF的左循环移位指令RCL和右循环移位指令RCR(也称大循环)。循环移位指令的操作数类型与移位指令相同,可以是8位或16位的寄存器或存储器。上一页下一页返回5.2指令系统指令中指定的左移或右移的位数也可以是1或由CL寄存器指定。但不能是1以外的常数或CL以外的寄存器。循环移位指令都只影响进位标志CF和溢出标志OF,但OF标志的含义对于左循环移位指令和右循环移位指令有所不同,如图5-16所示。循环左移:循环右移:带进位的循环左移:带进位的循环右移:操作数OPRD可以是通用寄存器也可以是存储器操作数。上一页下一页返回5.2指令系统前两条循环指令没有把进位标志CF包含在循环的环中;后两条循环指令把进位标志CF包含在循环的环中,即作为整个循环的一部分。这些指令只影响标志CF和OF。对于不带进位的循环移位指令而言,如果操作数是8位,操作数就能复原;如果操作是16位,操作数就能复原。对于带进位的循环移位指令而言,如果操作数是8位,那么在移位9次后,操作数就能复原;如果操作是16位,那么在移位17次后,操作数就能复原。5.2.5转移指令8088/8086提供了4种转移指令:无条件转移指令、条件转移指令、重复控制指令和子程序调用指令。上一页下一页返回5.2指令系统下面分别来介绍这4种指令,见表5-4.1.无条件转移指令无条件转移指令可以转到内存任何地方,该指令不影响标志位的值,但它改变IP寄存器或CS寄存器的内容。它有如下4种方式,见表5-5。(1)段内直接转移指令指令格式:①JMPSHORT标号②JMPNEARPTR标号(或JMP标号)上一页下一页返回5.2指令系统指令执行的操作:格式①(IP)←(IP)+8位位移量;格式②(IP)←(IP)+16位位移量。段内直接转移指令,目的操作数均用标号表示,程序转向的有效地址等于当前IP寄存器的内容加上8位或者16位位移量(DISP)。如果位移量位是16位,那么表示近转移,说明目的地址与当前IP的距离在-32768~+32767个字节之间。如果转移的范围在-128~+127个字节之内,则称为短转移,指令中只需要用8位位移量,是近转移指令的一个特例。在机器语言指令中,8位或16位位移量用带符号数表示,正的位移量表示向高地址方向转移,负的位移量表示向低地址方向转移,负位移量必须用补码表示。上一页下一页返回5.2指令系统(2)无条件段内间接转移指令格式:指令使控制无条件地址转移到由操作数OPRD的内容给定的目标地址处。操作数OPRD可以是通用寄存器,也可以是字存储单元。将取得的偏移地址装入指令寄存器IP,实现转移。(3)无条件段间直接转移指令格式:指令中使用远标号直接给出了转向的段地址和偏移量,用指令中的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容,就可使程序从一个代码段转到另一个代码段去执行。上一页下一页返回5.2指令系统(4)无条件段间间接转移指令格式:指令将目的地址的段地址和偏移量事先放在存储器中的4个连续地址单元中,其中,前两个字节为偏移量,后两个字节为段地址,转移指令中给出存放目标地址的存储单元的首字节地址值。这种指令的目的操作数前要加说明符DWORDPTR,表示转向地址需取双字。2.过程调用和返回指令在编写程序时,往往把某些能完成特定功能而又经常要用到的程序段编写成独立的模块,并把它称为过程(Procedure),习惯上也称作子程序(Subroutine),然后在程序中用CALL语句调用这些过程,调用过程的程序称为主程序。上一页下一页返回5.2指令系统过程以语句PROC开头,用语句ENDP结束。在ENDP之前要放一条过程返回指令RET,它与CALL指令相呼应,使过程执行完毕后,能正确返回主程序中紧跟在CALL指令后面的那条指令继续运行。(1)CALL调用指令格式:CALLOPD功能:把返回点(即CALL指令的下一条指令地址)压入堆栈保存后,转向目标地址处执行子程序。本指令不影响标志位的值。该指令有如下4种形式:1)段内直接调用上一页下一页返回5.2指令系统格式:功能:先将指令指针的值入栈保护,然后将目标地址与调用指令地址减的相对偏移量加到指令指针IP上,实现过程调用。2)段内间接调用格式:功能:先将指令指针入栈保护,然后从16位通用寄存器或所寻址的存储器字中取出目标地址,替换IP,实现过程调用。3)段间直接调用格式:上一页下一页返回5.2指令系统功能:显示当前CS入栈后,把指令中的段地址字送CS,再将指令指针IP入栈,然后将指令中的偏移量送入IP,实现不同段的过程转移。4)段间间接调用。格式:功能:先当前CS入栈,把所寻址的存储器双字中的第2个字的内容送CS,然后让指令指针IP入栈,再把存储器双字中的第1个字的内容送IP,以实现段间调用。(2)RET返回指令格式:RET上一页下一页返回5.2指令系统功能:过程执行完后,通过本指令返回原调用程序的返回处。本指令不影响标志位。对段内调用,返回指令由堆栈弹出返回点的偏移量到IP中实现调用返回。对段间调用,返回指令从堆栈弹出返回点的偏移量到指令指针IP外,还把返回点所在的段基址寄存器CS内容弹回代码段寄存器CS中,才能实现返回。3.条件转移指令8086/8088提供了大量的条件转移指令,它们根据某标志位或某些标志位的逻辑运算来判别条件是否成立。如果条件成立,则转移,否则继续顺序执行。所有条件转移都只是段内转移。条件转移指令不影响标志。上一页下一页返回5.2指令系统所有的条件转移均为段内短转移,也就是说,转移指令与目的地址必须在同一代码段中。目的地址由当前IP值与指令中给出的8位相对位移量相加而成,它与转移指令之后的指令间的距离,允许为-128~+127字节。8位偏移量是用符号扩展法扩展到16位后才与IP相加的。条件转移指令通常用在比较指令或算术逻辑运算指令之后,根据比较或运算结果,转向不同的目的地址。在指令中,目的地址均用标号表示,因此指令的格式为:条件操作符标号上一页下一页返回5.2指令系统条件转移指令共有19条,可以进行如下归类。(1)根据单个条件标志的设置情况转移①JZ(或JE)(Jumpifzero,orequal)结果为零(或相等)则转移格式:JZ(或JE)OPRD测试条件:ZF=1②JNZ(或JNE)(Jumpifnotzero,ornotequal)结果不为零(或不相等)则转移格式:JNZ(或JNE)OPRD上一页下一页返回5.2指令系统测试条件:ZF=0③JS(Jumpifsign)结果为负则转移格式:JSOPRD测试条件:SF=1④JNS(Jumpifnotsign)结果为正则转移格式:JNSOPRD测试条件:SF=0⑤JO(Jumpifoverflow)溢出则转移格式:JOOPRD上一页下一页返回5.2指令系统测试条件:OF=1⑥JNO(Jumpifnotoverflow)不溢出则转移格式:JNOOPRD测试条件:OF=0⑦JP(或JPE)(Jumpifparity,orparityeven)奇偶位为1则转移格式:JP(或JPE)OPRD测试条件:PF=1⑧JNP(或JPO)(Jumpifnotparity,orparityodd)奇偶位为0则转移上一页下一页返回5.2指令系统格式:JNP(或JPO)OPRD测试条件:PF=0⑨JB(或JNAE,JC)(Jumpifbelow,ornotaboveorequal,orcarry)低于,或者不高于或等于,或进位位为1则转移格式:JB(或JNAE,JC)OPRD测试条件:CF=1⑩JNB(或JAE,JNC)(Jumpifnotbelow,oraboveorequal,ornotcarry)不低于,或者高于或者等于,或进位位为0则转移上一页下一页返回5.2指令系统格式:JNB(或JAE,JNC)OPRD测试条件:CF=0(2)比较两个无符号数,并根据比较的结果转移①JB(或JNAE,JC)格式:JB(或JNAE,JC)OPRD②JNB(或JAE,JNC)格式:JNB(或JAE,JNC)OPRD③JBE(或JNA)低于或等于,或不高于则转移格式:JBE(或JNA)OPRD测试条件:CFVZF=1上一页下一页返回5.2指令系统④JNBE(或JA)不低于或等于,或高于则转移格式:JNBE(或JA)OPRD测试条件:CFVZF=0(3)比较两个带符号数,并根据比较的结果转移①JL(或LNGE)小于,或者不大于或者等于则转移格式:JL(或LNGE)OPRD测试条件:SFVOF=1②JNL(或JGE)不小于,或者大于或者等于则转移格式:JNL(或JGE)OPRD上一页下一页返回5.2指令系统测试条件:SFVOF=0③JLE(或JNG)小于或等于,或者大于则转移格式:JLE(或JNG)OPRD测试条件:(SFVOF)VZF=1④JNLE(或JG)不小于或等于,或者大于则转移格式:JNLE(或JG)OPRD测试条件:(SFVOF)VZF=0(4)测试CX的值为0则转移指令JCXZCX寄存器的内容为零则转移上一页下一页返回5.2指令系统格式:JCXZOPRD测试条件:(CX)=04.循环指令利用条件转移指令和无条件转移指令可以实现循环,但是为了更加方便循环的实现,8086/8088还提供了四条用于实现循环的循环指令。循环控制指令是一组增强型的条件转移指令,用来控制一个程序段的重复执行,重复次数由CX寄存器中的内容决定。这类指令的字节数均为2,第1字节是操作码,第2字节是8位偏移量,转移的目标都是短标号。上一页下一页返回5.2指令系统它们的操作过程与条件转移类似,转移地址等于当前IP加上8位偏移量,8位偏移量与IP相加时,先按符号扩展法扩展到16位后再相加,循环指令中的偏移量都是负值。循环控制指令均不影响任何标志,这类指令共有4条。循环标志不影响各标志位。(1)计数循环指令LOOP格式:LOOP标号指令功能:指令用于控制重复执行一系列指令。指令执行前,必须事先将重复次数放在CX寄存器中,每执行一次LOOP指令,CX自动减1。上一页下一页返回5.2指令系统如果减1后CX>0,则转移到指令中所给定的标号处继续循环;若自动减1后CX=0,则结束循环,转去执行LOOP指令之后的那条指令。一条LOOP指令相当于执行以下两条指令的功能:JNZ标号利用LOOP指令构成循环时,先要设置好计数器CX的初值,即循环次数。由于首先进行CX寄存器减1操作,再判结果是否为0,所以最多可循环65536次。程序段实现把从偏移1000H开始的512个字节的数据复制到从偏移3000H开始的缓冲区中。上一页下一页返回5.2指令系统(2)等于/全零循环指令LOOPE/LOOPZ上一页下一页返回5.2指令系统格式:LOOPE标号或LOOPZ标号指令使寄存器CX的值减1,当为0或相等时(且零标志ZF等于1),则转移到标号,否则顺序执行。注意指令本身实施的寄存器CX减1操作不影响标志位。(3)不等于/非零循环LOOPNE/LOOPNZ格式:LOOPNE标号或者LOOPNZ标号指令使寄存器CX的值减1,如果结果不为0或不相等时,并且零标志ZF等于0,则转移到标号,否则顺序执行。CX减1操作不影响标志位。上一页下一页返回5.2指令系统5.2.6串操作指令为了方便字符串的处理,8088/8086系统设置了5条字符串指令,专门对存储器中的字节串和字串数据进行传送、比较、扫描、存储及装入等5种操作。在字符串操作指令前加上重复前缀,以实现字符串的循环处理。字符串操作指令中,使用SI寄存器(源串存放在当前数据段中)寻址源操作数,段基址使用DS寄存器。用DI寄存器(目标串存放在附加数据段中)寻址目的操作数,段基址使用ES寄存器。字符串指令执行时将自动修改SI,DI地址指针,见表5-6。上一页下一页返回5.2指令系统为了加快串运算指令的执行速度,可在基本指令前加重复前缀,使数据串指令重复执行。每重复执行一次,地址指针SI和DI都根据方向标志自动进行修改,CX的值则自动减1。能与基本指令配合使用的重复前缀有:REP无条件重复REPE/REPZ相等/结果为零则重复REPNE/REPNZ不相等/结果非零则重复无条件重复前缀指令REP常与串传送指令连用,表示连续进行字符串传送操作,直到整个字符串传送完毕,CX=0为止。上一页下一页返回5.2指令系统重复前缀REPE和REPZ具有相同的含义,它们常与串比较指令(CMPS)连用,连续进行字符串比较操作。当两个字符串相等(ZF=1)或CX≠0时,则重复进行比较,直到ZF=0或CX=0为止。重复前缀REPNE和REPNZ也具有相同的意义,它们常与串扫描指令连用,当结果非0(ZF=0)或CX≠0时,重复进行扫描,直到ZF=1或CX=0为止。1.MOVS字符串传送指令指令格式:MOVS目的串,源串指令功能:把由SI作指针的源串中的一个字节或字,传送到由DI作指针的目的串中,且自动修改指针SI和DI。上一页下一页返回5.2指令系统在实际应用中,若需要在存储单元之间传送数据,MOV指令不能直接在存储单元间进行数据传送,为了实现这种操作,必须以某一通用寄存器为桥梁,先把一个存储单元中的数据送到指定的通用寄存器中,再将寄存器中的数据传送到另一个存储单元中。每进行一次传送操作,还必须修改地址指针。MOVS指令便能很方便地实现这种功能,它不但能将数据从内存的某一地址(源地址)传送到另一个地址(目的地址),还能自动修改源和目的地址。若使用重复前缀,还可以利用一条指令传送一批数据。2.LODS数据串装入指令指令格式:LODS源串上一页下一页返回5.2指令系统指令功能:把数据段中以SI作为指针的串元素传送到AL(字节操作)或AX(字操作)中,同时修改SI,使它指向一串中的下一个元素,SI的修改量由方向标志DF和源串的类型确定。该指令使用重复前缀没有意义,这是因为每重复传送一次数据,累加器中的内容就被改写,执行重复传送操作后,只能保留最后写入的那个数据。3.STOS数据串存储指令指令格式:STOS目的串指令功能:将累加器AL或AX中的一个字节或字,传送到附加段中以DI为目标指针的目的串中,同时修改DI,以指向串中的下一个单元。上一页下一页返回5.2指令系统STOS指令与REP重复前缀连用,即执行指令REPSTOS,能方便地用累加器中的一个常数。4.CMPS字符串比较指令指令格式:CMPS目的串,源串指令功能:从SI作指针的源串中减去由DI作指针的目的串数据,相减后的结果反映在标志位上,但不改变两个数据串的原始值。同时,操作后源串和目的串指针会自动修改,指向下一对待比较的串。常用这条指令来比较两个串是否相同,并由加在CMPS指令后的一条条件转移指令,根据CMPS执行后的标志位值决定程序的转向。上一页下一页返回5.2指令系统在CMPS指令前可以加重复前缀,即这两条指令功能相同,执行过程是:若比较结果为CX≠0(指定的长度还未比较完)或ZF=1(两串相等),则重复比较,直至CX=0(比完了)或ZF=0(两串不相等)时才停止操作。也可以改用重复前缀REPNE或REPNZ,它们表示:若CX≠0(串没有结束)或ZF=0(串不等),则重复比较,直至CX=0或ZF=1时才停止比较。5.SCAS字符串扫描指令指令格式:SCAS目的串上一页下一页返回5.2指令系统指令功能:将AL(字节操作)或AX(字操作)寄存器的内容减去附加段中以DI为指针的目的串元素,结果反映在标志位上,但不改变源操作数。同时,操作后目的串指针会自动修改,指向下一个待搜索的串元素。利用SCAS指令,可在内存中搜索数据。被搜索的数据也称为关键字。指令执行前,必须事先将它存在AL(字节)或AX(字)中,才能用SCAS指令进行搜索。SCAS指令前也可以加重复前缀。5.2.7处理器控制指令1.标志操作指令上一页下一页返回5.2指令系统程序状态寄存器的条件标志位记录着程序运行的状态信息。IBMPC中除了算术运算指令、逻辑运算指令及移位指令等在执行中会影响标志位外,还专门提供了一组用于设置或清除标志位的指令。标志操作指令只影响自身的标志位,而不影响其他标志位。(1)清进位标志指令CLC格式:CLC该指令使进位标志为0。也就是说CF=0。(2)置进位标志指令STC格式:STC该指令使进位标志为1。也就是说CF=1。上一页下一页返回5.2指令系统(3)进位标志取反指令CMC格式:CMC该指令使进位标志取反。如CF为1,则使CF为0;如CF为0,则CF为1。(4)清方向标志CLD格式:CLD该条指令使方向标志DF为0,从而在执行串操作指令时,使地址按递增方式变化。(5)置方向标志STD格式:STD上一页下一页返回5.2指令系统该条指令使方向标志DF为1,从而在执行串操作指令时,使地址按递减方式变化。(6)清中断允许标志CLI格式:CLI

温馨提示

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

评论

0/150

提交评论