2个回答
展开全部
简单点说,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
所以说不要只是记一个指令怎么用,而是要理解一个指令到底是什么原理。
详细点说:
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
所以说不要只是记一个指令怎么用,而是要理解一个指令到底是什么原理。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询