当组件具有像JMP˚F会发生什么到堆栈和帧指针的指令?JMP做什么堆栈和帧指针?
我的意思是 - ˚F在内存中正确标签吗?我们如何可以跳转到不同的地址在内存中,而不是更新我们的框架和堆栈指针...
编辑:我组装谈论英特尔的x86是:)
当组件具有像JMP˚F会发生什么到堆栈和帧指针的指令?JMP做什么堆栈和帧指针?
我的意思是 - ˚F在内存中正确标签吗?我们如何可以跳转到不同的地址在内存中,而不是更新我们的框架和堆栈指针...
编辑:我组装谈论英特尔的x86是:)
堆栈和帧指针处理位置数据的。 jmp
指令处理位置的代码。除非发生严重事故,否则不应该影响其他事件。这里有激烈的事情的清单:
jmp
。就是这样。即使那些个案会更改堆栈,因为它们涉及某种上下文切换,无论是新任务还是某个异常处理程序。
还请注意,我所知道的任何操作系统都使用CPU的任务切换功能。它通常用软件实现。
我会想你是在谈论英特尔指令?在这种情况下,任何堆栈/帧指针都不会发生任何变化,代码只是在相同的上下文中继续执行,但在新地址处继续执行。
我想这个答案有一些注意事项 - 它是可能导致使用jmp指令的任务切换,在这种情况下,可能会发生各种疯狂的东西。您可能需要阅读所有文档的详细信息。该Intel Software Developer's Manual有所有的细节:
jmp
文档中卷2A编辑:指的是你对不更新跳跃问题。
你有能够跳过你的代码,而无需修改堆栈&帧指针。例如,与C代码中的goto
相同 - 您可以跳过所有函数而不需要修改执行上下文。
我们如何可以跳转到不同的地址在内存中,而不是更新我们的框架和堆栈指针...
由于指令指针(EIP)存储在不同的寄存器从框架和堆栈指针(esp,ebp)。改变一个不会影响其他人(通常)。
好的谢谢。我想我会提出一个更具体的问题,绘制堆栈帧等,然后再问一次。如果只有我可以很容易地画出他们的地方... – drozzy 2010-03-17 21:11:10
JMP
是组装的goto
,与所有的暗示。
有时候,你只需要启动从不同的地址执行。
只是注意:在x86上,有许多种“JMP”指令。正如Carl指出的那样,最常见的是“本地”jmp,它只是简单地改变EIP寄存器的值,所以堆栈帧根本不被触及。我假设你是在谈论这种类型的JMP的,因为它是一个装配有语法像产生:
jmp label
...
label:
但也有“远”跳,这也影响了CS段寄存器。如果处理器处于实模式,它只不过是CS:IP寄存器的变化(只是一个“较大的”跳转),但在保护模式下,CS段具有非常不同且更复杂的功能:它被解释为描述符呼叫/任务/中断门,即指数在定义一样的权限级别很多事情描述符表,任务...根据具体的描述,一个特权等级升级可能发生,或者也是一个“硬件任务”开关。这可能会导致上下文更改。除非您正在编程操作系统的核心,否则通常不会在保护模式下发现较远的跳转。创建段描述符几乎总是一个内核的工作。
问候
+1为实际解释本地跳 – zebrabox 2010-03-17 21:26:12
我认为你的解释其实清楚了我! JMP是跳转到代码中的某个位置,文本块!我知道了。谢谢! – drozzy 2010-03-17 21:41:27