汇编语言---转移指令1
2010-07-18 22:10:37| 分类: ASM |举报|字号 订阅
转移指令是汇编程序员经常要用到的一组指令;在高级语言中,时常有"尽量不要使用转移指令语句"的劝告,但是,如果在汇编语言程序中叶尽量不使用转移指令语句,那么,该程序要么无法编写,要么就是没有多少功能;所以,在汇编语言程序中,不但要使用转移指令,而且还要灵活运用,因为指令系统中有大量的转移指令;
转移指令分为无条件转移指令和有条件转移指令;
1.无条件转移指令(Transfer Unconditionally)
无条件转移指令包括:JMP、子程序的调用和返回指令、中断的调用和返回指令,等等;
JMP的指令格式: JMP 标号/reg/mem
JMP指令是从程序当前执行的地方无条件地转移到另一个地方执行.这个转移可以是一个短(short)转移(偏移量在[-128,127]的范围之内)、近(near)转移(偏移量在[-32K,32K]的范围之内)、远(far)转移(在不同的代码段之间转移);
短转移和近转移都是段内转移,JMP指令只会目标指令位置处的偏移量赋值给指令指针寄存器IP,从而实现转移功能;但是远转移属于段间转移,JMP指令不仅会把目标指令位置处的偏移量赋值给指令指针寄存器,同时还会把目标指令所处的代码段的段地址赋值给当前代码段寄存器CS;
注意:JMP指令的执行不会影响任何标志位;
例如:
......
NEXT1: ......
JMP NEXT1 ;向前转移,偏移量之差为负值;
......
JMP NEXT2 ;向后转移,偏移量之差为正值;
......
NEXT2: ......
目前,在流行的汇编系统中,当发生段内转移时,有些软件会把该转移指令默认为近转移,从而使指令的偏移量用1个字来表示,于是就生成3个字节的指令码,但是,如果程序员自己已经清楚转移的幅度在一个短转移的范围之内,那么,就可用前置short的方法来告诉汇编程序,让它只产生2个字节的指令码;
比如:在上面的伪代码中,如果程序员知道标号NEXT2距离"JMP NEXT2"指令的偏移量不会超过127字节,那么,可用下面的转移方式来省掉一个字节的指令码;
......
JMP short NEXT2 ;只生成2个字节的转移指令,从而节省一个字节;
......
NEXT2: ......
2.有条件转移指令
有条件转移指令是一组及其重要的转移指令,它根据标志寄存器中的一个(或多个)标志位来决定是否需要转移,这就为实现多功能程序提供了必要的手段;微机的指令系统提供了丰富的条件转移指令来满足各种不同的转移需要,在编写程序时,要对它们灵活运用;
条件转移指令可分为三类:基于无符号数的条件转移指令、基于有符号数的条件转移指令、基于特殊算术标志位的条件转移指令;
(1).基于无符号数的条件转移指令(Jumps Based on Unsigned(Logic) Data)
指令助记符 检测的跳转条件 功能描述
JE/JZ ZF = 1 结果相等或为0,则跳转
JNE/JNZ ZF = 0 结果不相等/不为零,则跳转
JA/JNBE CF = 0 And ZF = 0 结果大于/不等于不小于,则跳转
JAE/JNB CF = 0 结果大于等于/不小于,则跳转
JB/JNAE CF = 1 结果小于/不大于不等于,则跳转
JBE/JNA CF = 1 Or AF = 1 结果小于等于/不大于,则跳转
(2).基于有符号数的条件转移指令(Jumps Based on Special Arithmetic Tests)
指令助记符 检测的跳转条件 功能描述
JE/JZ ZF = 1 结果相等或为0,则跳转
JNE/JNZ ZF = 0 结果不相等或不为0,则跳转
JG/JNLE ZF = 0 And SF = OF 结果大于/不小于等于,则跳转
JGE/JNL SF = OF 结果大于等于/不小于,则跳转
JL/JNGE SF != OF 结果小于/不大于不等于,则跳转
JLE/JNG ZF = 1 Or SF != OF 结果小于等于/不大于,则跳转
(3).基于特殊算术标志的条件转移指令(Jumps Based on Special Arithmetic Tests)
指令助记符 检测的跳转条件 功能描述
JC CF = 1 如果产生进位,则跳转
JNC CF = 0 如果不产生进位,则跳转
JO OF = 1 如果溢出,则跳转
JNO OF = 0 如果不溢出,则跳转
JP/JPE PF = 1 如果运算结果中有偶数个1,则跳转
JNP/JPO PF = 0 如果运算结果中有奇数个1,则跳转
JS SF = 1 如果结果是负数,则跳转
JNS SF = 0 如果结果是非负数,则跳转
汇编语言---转移指令2
2010-07-19 01:28:08| 分类: ASM |举报|字号 订阅
转移指令是用来改变程序执行顺序的;这组指令是编写分支程序时不可缺少的一组指令;
转移指令可分为条件转移指令和无条件转移指令;对于条件转移指令,只有当指令中指出的条件满足时才发生转移/跳转;如果指令中指出的条件不满足,则继续顺序执行;在发生转移时,段寄存器CS和对应的指令指针寄存器IP的值将被指令中指出的目的指令所在段地址和段内偏移量所取代;若转移仅仅发生在同一个代码段内,那么段寄存器CS的值保持不变,只是改变一下指令指针IP的值;
一、无条件转移指令JMP
无条件转移指令的难点在于其寻址方式;根据其转向地址提供方式的不同,可分为直接转移和间接转移;格式有5种:
第一种格式:JMP SHORT OPR ;功能描述:[IP]=[IP]+8位偏移量;
第二种格式:JMP NEAR PTR OPR ;功能描述:[IP]=[IP]+16位偏移量;
第三种格式:JMP OPR1 ;功能描述:[IP]=[EA];(EA为由OPR1确定的有效地址)
第四种格式:JMP FAR PTR OPR ;功能描述:[IP]=待转向地址的偏移地址,[CS]=待转向地址的段地址;
第五种格式:JMP OPR1 ;功能描述:[IP]=[EA];(EA为由OPR1确定的有效地址);[CS]=[EA+2];
1、直接转移指令有以下三种:
(1).段内直接短转移:
JMP SHORT OPR
其中,OPR的格式为"标号/reg/mem",它指出了将要转向的目标地址,指令的寻址方式为相对寻址,也就是说,指令机器码中给出的是一个8位的相对位移量D8;该指令总共只有两个字节:第一个字节是指令的机器码,第二个字节就是这个8位的相对位移量D8;D8=待转向地址-IP的当前值;这样计算,就可以得到下一条将要执行的指令的地址;这个8位的相对位移量是一个有符号数,采用补码形式表示,所以,其取值范围就是[-128,+127];所以,段内直接短转移时,偏移的指令码的字节数之和不能超过128字节;也就是,待转向的目的地址与当前地址的差的绝对值不能超过128字节;
(2).段内直接近转移:
JMP NEAR PTR OPR
指令中的OPR与段内直接短转移的完全一样;它们的区别就是:段内直接近转移的相对位移量是16位(2字节),可跳转的指令机器码的范围更大一些;可转向段内的任意地址;
(3).段间直接远转移:
JMP FAR PTR OPR
指令中的OPR与算内直接短转移的完全一样,但其寻址方式是直接寻址方式,即:在指令的机器码中,直接给出待转向的目的地址的段地址和段内偏移地址;该指令的机器码包含5个字节:由于指令机器码中同时提供了段地址和段内偏移地址,所以,段间直接远转移可以跳转的指令码范围更大,可高达1MB;
例如,下列指令都是合法的:
JMP SHORT MULT1
JMP NEAR PTR MULT1
JMP FAR PTR MULT1
JMP SHORT MULT1+0AH
2、间接转移指令
格式为: JMP OPR1
间接转移指令分为段内间接转移指令和段间间接转移指令;指令中给出的OPR1不再是待转向的目标地址本身,而是存放待转向的目标地址的存储单元,也就是使用一个存储单元来存放待转向的目标地址,其寻址方式可以是出了立即数之外的各种寻址方式;
(1).段内间接转移:
由于是段内转移,存放待转向的目标地址的存储单元只需是一个16位的存储单元即可,用于存放一个16位的段内偏移量(即:待转向的目标地址的偏移地址),所以,OPR1可以是一个16位的寄存器,也可以是一个字类型的变量(内存单元);
例如:
JMP BX ;待转向的目标地址存放在寄存器BX中
JMP TADR [DI] ;待转向地址在EA = OFFSET TADR + [DI]所指向的存储单元中,其中:TADR是字类型变量
JMP WORD PTR [BX] ;待转向地址在寄存器BX的值所指向的一个16位内存单元中
JMP DBT1 ;待转向地址在DBT1对应的内存单元中,DBT1是一个字变量
(2).段间间接转移
存放待转向地址的存储单元中不仅要存放待转向地址的偏移地址,而且也要存放待转向地址所在段的段地址,所以,存放待转向地址的存储单元必须是一个双字类型的变量;
例如:
JMP DWORD PTR [DI]
JMP DBT2
JMP TADR1 [BX]
DBT2 DD 04000000H
TADR1 DD 06000010H,06000040H,06000086H
二、条件转移指令
条件转移指令中,只有当指令中给定的条件满足时才发生转移,否则,继续顺序执行;条件判断的依据是标志寄存器中各个标志位的当前状态,这些标志位的状态是由其它指令在运行时产生的;