微机原理与汇编语言中的指令JMP、CALL的区别
汇编语言中,JMP是无条件转移指令,CALL是子程序调用指令。
指令JMP、CALL的区别在于,JMP指令控制程序直接跳转到目标地址执行程序,程序总是顺序执行,指令本身无堆栈操作过程。CALL指令跳转到指定目标地址执行子程序,执行完子程序后,会返回CALL指令的下一条指令处执行程序,执行CALL指令有堆栈操作过程。
举例如下:
JMP NEAR NEXT跳转到NEXT执行程序
......
NEXT: 目标地址,程序将从这里向下执行
......
CALL NEXT调用从地址NEXT开始的子程序
NOP 子程序结束后返回到这里,然后向下继续执行程序
......
NEXT: 子程序目标地址,程序将从这里向下执行
RET 子程序返回指令,子程序执行到此结束,返回CALL指令的下一条指令处
LCALL是调用子程序,当子程序执行完后就返回到LCALL指令下一条指令继续执行程序,而子程序是可以多次调用,也可以在任何位置调用。这是从哪里走的,还要返回哪里的。
而JMP是无条件转移指令,转移到某执行程序后就不再返到回原处,是一去不回返的。
1、字节不同
SJMP 如果跳转到的标号地址距离当前PC所指的地址小于256字节,用SJMP。
AJMP 如果跳转到的标号地址距离当前PC所指的地址小于2K字节,用AJMP。
LJMP 如果跳转到的标号地址距离当前PC所指的地址小于64K字节,用LJMP。
ACALL是调用的子程序入口地址距离当前PC所指地址需介于0~2K,LCALL是0~64K。
2、跳转的范围不一样。
AJMP 的范围是11位地址,也就是2K的空间内,占用存储空间2个字节,执行周期24个时钟周。
LJMP 的范围是16位地址,也就是64K的空间内,占用存储空间3个字节,执行周期24个时钟周期。
SJMP 的范围是8位地址,也就是256BIT的空间内,占用存储空间2个字节,执行周期24个时钟周期。
JMP一般配合DPTR使用,存储空间1个字节,执行周期24个时钟周期。一般用于多分枝选择的时候使用,比如按键处理。
ACALL,LCALL和以上说明类似,是调用指令,ACALL占用存储空间2个字节,执行周期24个时钟周期。LCALL占用存储空间3个字节,执行周期24个时钟周期。
扩展资料:
①短程转移(直接短转移)
指令格式:JMP SHORT OPRD
语法格式: JMP 地址标号 ;(IP)←(IP)+8位位移量
指令功能:OPRD为转移地址的标号,指令中的SHORT规定了OPRD为有符号的8位二进制数,OPRD为转移地址的偏移量。该指令将程序执行的顺序转移到由(IP)+OPRD形成的新的程序执行的目标地址,从而实现程序的转移。
转移的目标地址OPRD在指令中可以直接使用标号地址,但要求转移的目标地址的范围只能在JMP指令所处地址的-128~+127字节范围之内,如超出该范围,汇编时出错。
② 近程转移(段内直接转移)
指令格式:JMP NEAR PTR OPRD
语法格式: JMP 地址标号 ;(IP)←(IP)+16位位移量
指令功能:与短程转移的功能和要求相同,不同之处是近程转移的OPRD为有符号的16位二进制数,指令将程序执行的顺序转移到由(IP)+OPRD形成的新的程序执行的目标地址。
转移的目标地址的范围只能在JMP指令所处地址的-32768~+32767字节范围之内,如超出该范围,汇编时出错。使用该指令时NEAR可省略
③段间直接转移(远程转移)
指令格式:JMP FAR PTR OPRD
语法格式: JMP 地址标号 ;(IP)←新的偏移地址, ;(CS)←新的代码段地址
指令功能:指令中用FAR PTR规定了该指令为段间的转移,OPRD为目的地址的标号,目的地址与JMP指令所在地址不在同一段内。执行该指令时要修改CS和IP的内容,将OPRD所在段的段地址送CS中,OPRD的段内偏移地址送IP中。
④ 段内间接转移
指令格式:JMP WORD PTR OPRD
语法格式:JMP reg16/mem ;(IP)←新的偏移地址
指令功能:与短程转移的功能和要求相同,不同之处是段内间接转移的OPRD 可以是除立即数外的任何寄存或存储器寻址方式,转移的目标地址由OPRD的内容确定。
⑤ 段间间接转移
指令格式:JMP DWORD PTR OPRD
语法格式:JMP mem32
指令功能:指令中用DWORD PTR规定了该指令为段间间接转移,OPRD只能是存储器寻址方式。执行该指令时将寻址到的内存单元的第一个字送入IP中,第二个字送入CS中。
参考资料来源:百度百科-JMP (软件)
参考资料来源:百度百科-SJMP
参考资料来源:百度百科-ljmp
参考资料来源:百度百科-AJMP
一、程序执行顺序不同
1、LCALL:LCALL是调用子程序,当子程序执行完后就返回到LCALL指令下一条指令继续执行程序
2、JMP:JMP是无条件转移指令,转移到某执行程序后就不再返到回原处,是一去不回返的。
二、程序处理方式不同
1、LCALL:指令在进行流程跳转前会保存返回地址,以便在跳转目标代码中可以使用ret指令返回到call指令的下一条指令处继续执行。执行段内跳转时,只保存EIP;如果是段间跳转,还保存CS。
2、JMP:进行执行流程的跳转,不会保存返回地址。
三、程序执行过程不同
1、LCALL:执行LCALL命令时,将当前的 IP 或 CS和IP 压入栈中,之后转移到紧跟的标号行地址执行程序。
2、JMP:JMP指令控制程序直接跳转到目标地址执行程序,程序总是顺序执行,指令本身无堆栈操作过程。
如果跳转到的标号地址距离当前PC所指的地址小于256字节,用SJMP
AJMP
如果跳转到的标号地址距离当前PC所指的地址小于2K字节,用AJMP
LJMP
如果跳转到的标号地址距离当前PC所指的地址小于64K字节,用LJMP
ACALL是你调用的子程序入口地址距离当前PC所指地址需介于0~2K,LCALL是0~64K。