80X86汇编语言程序设计⑧.80868088指令系统(五)转移指令[收.pdf
80X86 汇编语言程序设计第二章 8086/8088 寻址方式和指令系统-(五)转移指令1.无条件转移指令(没有条件碰到就转)(1)无条件段内直接转移指令格式:JMP 标号这条指令使控制无条件地转移到标号地址处。例如:NEXT:MOV AX,CXJMP NEXT;转到 NEXT 处JMP OVER;转到 OVER 处OVER:MOV AX,1无条件段内直接转移指令格式如下:由操作码和地址差值构成。指令的操作码|地址差地址差:是程序中该无条件转移指令的下一条指令的开始地址到转移目标地址(标号所指定的开始地址)的差值。因为,在执行无条件段内转移指令时,实际的动作是把指令中的地址差加到指令指针IP 上,使 IP 之内容为目标地址,从而达到转移的目的。段内无条件直接转移指令中的地址差可用一个字节表示,也可用一个字表示。如果地址差只要用一个字节表示,就称为短转移;如果地址差要用一个字表示,就称为近转移。段内短跳转:(-128127)JMP SHORT QUEST段内近跳转:(64KB)JMP NEAR PTR PROG(2)无条件段内间接转移指令格式:JMP OPRD这条指令使控制无条件地址转移到由操作数OPRD 的内容给定的目标地址处。操作数 OPRD 可以是通用寄存器,也可以是字存储单元。(3)无条件段间直接转移指令格式:JMP FAR PTR 标号这条指令使控制无条件地转移到标号所对应的地址处。标号前的符号“FAR PTR”向汇编程序说明这是段间转移。例如:JMP FAR PTR EXITEXIT 是定义在另一个代码段中的标号。无条件段间直接转移指令的具体动作时把指令中包含的目标地址的段值和偏移分别置入CS和IP。这种在指令中直接包含转移目标地址的转移方式称为绝对转移。(4)无条件段间间接转移指令格式:JMP OPRD这条指令使控制无条件地转移到由操作数OPRD 的内容给定的目标地址处。操作数 OPRD 必须是双字存储单元。例如:JMP DWORD PTR 1234H双字存储单元的低字内容送IP;双字存储单元的高字内容送CS。例如:(IP)=2BC0H,(CS)=0200H,位移量 D=5119H,(BX)=1200H,(DS)=212AH,(224A0)=0600H,(275B9)=098AH试为以下的转移指令找出转移的偏移地址:(求 IP)(1)段内直接寻址(2)使用 BX 及寄存器间接寻址方式的段内间接寻址(3)使用 BX 及寄存器相对寻址方式的段内间接寻址答案:(1)偏移地址=D+IP=5119H+2BC0H=7CD9H(2)JMP BX(16d*DS+BX)=212A0+1200=(224A0)=0600H(3)JMP BX+D(16d*DS+BX+D)=212A0+1200+5119=(275B9)=098AH2.条件转移指令-8086/8088 提供了大量的条件转移指令,它们根据某标志位或某些标志位的逻辑运算来判别条件是否成立。如果条件成立,则转移,否则继续顺序执行。所有条件转移都只是段内转移。条件转移指令不影响标志。有些条件转移指令有两个助记符,还有些条件转移指令有三个助记符。使用多个助记符的目的是便于记忆和使用。条件转移指令使用的最多的转移指令。通常,在条件转移指令前,总有用于条件判别的有关指令。下面的程序测试AX 的低 4位是否全是 0,如果均是是0,那么使CX=0,否则使CX=-1MOV CX,-1;先将 CX=-1TEST AX,0FH;测试 AX 的低 4位JNZ NZERO;不全为 0则转移MOV CX,0;全为 0时使 CX=0NEZRO:从表中可以看出有符号数间的次序关系称为大于(G)、等于(E)、小于(L);无符号数间的次序关系称为高于(A)、等于(E)、和低于(B)。所以,在使用时要注意区分它们。下面程序实现两个无符号数(设在AX 和 BX 中)的比较,把较大的数存放到AX 中,把较小的数存放在BX 中;CMP AX,BXJAE OKXCHG AX,BXOK:如果要比较的两个数是有符号数,则可用下面的程序片段:CMP AX,BXJGE OKXCHG AX,BXOK:无符号数之间大小比较后的条件转移指令和有符号数之间的大小比较后的条件转移指令测试的标志完全不同。无符号数和有符号数,两数是否相等可由ZF 标志的反应。进位标志CF 反应两个无符号数比较后的大小关系。两个有符号数比较后的大小关系由符号标志SF 和溢出标志OF一起来反映。设要比较的两个不相等的有符号数a 和 b 分别存放在寄存器AX 和 BX 中,执行指令“CMP AX,BX”后,标志SF 及 OF 的设置情况和两数的大小情况如下:当没有溢出(OF=0)时,若SF=0,则 ab若 SF=1,则 ab当产生溢出(OF=1)时,若SF=0,ab例如:设X、Y 均为存放在X 和 Y 单元中的 16位操作数,先判X50 否,如满足条件则转移到TOO-HIGH去执行,然后做X-Y,如溢出则转移到OVER 去执行,否则计算|X-Y|,并把结果存入 RESULT 中。MOV AX,XCMP AX,50JG TOO-HIGHSUB AX,YJO OVERJNS NONENEG AX;求补相当于求绝对值(0-AX)NONE:MOV RESULT,AXTOO-HIGH:OVER:例如:假设有100 个 16位无符号数存放在从1234:5678H开始的内存中,现需要求它们的和。设把32 位的和保存在DX(高位)和AX 寄存器中。MOV AX,1234HMOV DS,AXMOV SI,5678HMOV AX,0MOV DX,AXMOV CX,100NEXT:ADD AX,SIADC DX,0INC SIINC SIDEC CXJNZ NEXT例如:在存储器中有一个首地址位ARRAY 的 N 字数组,要求测试其中正数、0、及负数的个数。正数的个数放在DI 中,0的个数放在SI 中,并根据N-DI-SI求得负数的个数放在AX 中,如果有负数则转移到VAL 中去执行。MOV CX,N;把 N 放到 CX 中计数MOV BX,0;BX 清零MOV DI,BX;DI 清零MOV SI,BX;SI 清零AGAIN:CMP ARRAYBX,0;比较 ARRAYBX 和0JLE LESS;如果小于等于0跳到 LESSINC DI;否则,也就是大于,0则 DI+1JMP SHORT NEXT;跳到 NEXTLESS:JL NEXT;如果小于则跳转到NEXTINC SI;否则,就是等于0,则 SI+1NEXT:ADD BX,2;BX=BX+2DEC CX;CX=CX-1JNZ AGAIN;如果 CX 不等于 0,则跳转到AGAINMOV AX,N;将 N 送给 AXSUB AX,DI;AX=AX-DISUB AX,SI;AX=AX-SIJZ SKIP;如果 AX 为0则跳转到SKIPJMP NEAR PTR VAL;否则无条件跳转到VALSKIP:VAL:3.循环指令利用条件转移指令和无条件转移指令可以实现循环,但是为了更加方便于循环的实现,8086/8088 还提供了四条用于实现循环的循环指令。循环指令类似于条件转移指令,不公属于段内转移,而且也采用相对转移的方式,即通过在IP 上加一个地址差的方式实现转移。循环指令中也只用一个字节表示地址差。所以,如果以循环指令本身作为基准,那么循环转移的范围在-126至+129 之间。循环标志不影响各标志位。(1)计数循环指令LOOP格式:LOOP 标号这条指令使寄存器CX 的值减 1,如果结果不等于0,则转移到标号,否则顺序执行;该指令类似于如下的两条指令:DEC CXJNZ 标号通常在利用LOOP指令构成循环时,先要设置好计数器CX 的初值,即循环次数。由于首先进行 CX 寄存器减 1操作,再判结果是否为0,所以最多可循环65536 次。如下程序片段实现把从偏移1000H开始的 512 个字节的数据复制到从偏移3000H开始的缓冲区中MOV SI,1000HMOV DI,3000HMOV CX,512NEXT:MOV AL,SIINC SIMOV DI,ALINC DILOOP NEXT(2)等于/全零循环指令LOOPE/LOOPZ格式:LOOPE 标号LOOPZ 标号这条指令使寄存器CX 的值减 1,当为 0或相等时,(且零标志ZF 等于 1),那么则转移到标号,否则顺序执行。注意指令本身实施的寄存器CX 减1操作部影响标志位。如下:字符串中查找第一个非,A?字符。设字符串长度已保存在CX 中。并且 DS:DI 指向字符串。如果找到,那么使BX 指向该非,A?字符,如果找不到,那么使BX=0FFFFH。MOV AL,ADEC DINEXT:INC DICMP AL,DILOOPE NEXTMOV BX,DIJNE OKMOV BX,-1OK:(3)不等于/非零循环LOOPNE/LOOPNZ格式:LOOPNE 标号LOOPNZ 标号这条指令使寄存器CX 的值减 1,如果结果不为0不相等时,并且零标志ZF 等于 0,那么则转移到标号,否则顺序执行。CX 减1操作部影响标志位。(4)跳转指令JCXZ格式:JCXZ 标号该指令实现当寄存器CX 的值等于 0时转移到标号,否则顺序执行。通常该指令用在循环开始前,以便在循环次数为0时,跳过循环体。例如:JCXZ OKNEXT:LOOP NEXTOK:例如:有一串L 字符的字符串存储于首地址为TABLE的存储器中。如要求在字符串中查找“空格”字符,找到则继续执行,如未找到则转到NOT-FOUND去执行,编制此程序。MOV CX,LMOV SI,-1MOV AL,20H;也可以用MOV AL,NEXT:INC SICMP AL,TABLESILOOPNE NEXTJNZ NOT-FOUNDNOT-FOUND: