请问大家 汇编语言中 子程序调用指令和跳转指令有什么区别?谢谢

请问大家 汇编语言中 子程序调用指令和跳转指令有什么区别?谢谢

简单点说,call指令在跳转前保存当前指令地址,而jmp一类的指令不保存当前指令的地址。

详细点说:
call指令在跳转前会在栈中保存当前的程序计数器(IP)的值(有必要的话还要保存CS),保存完IP的值后,再去执行跳转指令。即相当于:

push CS (没有这种指令,有没有这一句还要看调用的类型:far/near)
push IP (没有这种指令)
jmp [word ptr/dword ptr] ...

这样,程序在执行ret/retf指令时就能从栈中取出IP的值,即相当于:

pop IP (没有这种指令)
pop CS (没有这种指令,有没有这一句也要看调用的类型)

来继续执行call指令后的其他指令,当然你也可以选择不执行ret,而把call当做jmp来用。这样也没有问题(没人这么干),只不过栈里多了点东西罢了,记得处理就好。

而形如jmp一类的指令只是简单的执行跳转(修改IP的值),并不保存IP的值。当然跳转后程序也就不知道原来是从哪里跳转到这里来的,自然就无法返回。
当然,这个时候ret指令还是可以用的,因为ret指令只是简单的从栈顶取出一个word然后赋给IP,所以也可以用ret指令来实现jmp的功能(也没人这么干)。如:

mov bx,offset s
push bx
ret

这样就相当于:

jmp s

所以说不要只是记一个指令怎么用,而是要理解一个指令到底是什么原理。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-23
CALL是子程序调用的指令,他有保存他下一条指令地址的能力,当执行完了子程序,在子程序的末尾,应该有个RET指令,RET指令,将会使CPU回到CALL下面的指令继续执行程序。
JMP是转移指令,转移到另一个地方去执行,他不保存他下一条指令的地址。
相似回答