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

请问大家汇编语言中子程序调用指令和跳转指令有什么区别?谢谢... 请问大家 汇编语言中 子程序调用指令和跳转指令有什么区别?谢谢 展开
 我来答
zzc880808
2009-12-25 · TA获得超过214个赞
知道答主
回答量:53
采纳率:0%
帮助的人:0
展开全部
简单点说,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

所以说不要只是记一个指令怎么用,而是要理解一个指令到底是什么原理。
做而论道
高能答主

2009-12-23 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
CALL是子程序调用的指令,他有保存他下一条指令地址的能力,当执行完了子程序,在子程序的末尾,应该有个RET指令,RET指令,将会使CPU回到CALL下面的指令继续执行程序。
JMP是转移指令,转移到另一个地方去执行,他不保存他下一条指令的地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式