2010-03-17 103 views
4

当组件具有像JMP˚F会发生什么到堆栈和帧指针的指令?JMP做什么堆栈和帧指针?

我的意思是 - ˚F在内存中正确标签吗?我们如何可以跳转到不同的地址在内存中,而不是更新我们的框架和堆栈指针...

编辑:我组装谈论英特尔的x86是:)

回答

5

堆栈和帧指针处理位置数据jmp指令处理位置代码。除非发生严重事故,否则不应该影响其他事件。这里有激烈的事情的清单:

  • 任务切换 - 由于使用任务门
  • 故障远跳 - 由于跳转到一个新的页面,是无效的,或跳出当前段或试图非法更改权限的jmp
  • 陷阱 - 例如,由于代码断点。事实上,目前还没有其他陷阱浮现在脑海。

就是这样。即使那些个案会更改堆栈,因为它们涉及某种上下文切换,无论是新任务还是某个异常处理程序。

还请注意,我所知道的任何操作系统都使用CPU的任务切换功能。它通常用软件实现。

+1

我认为你的解释其实清楚了我! JMP是跳转到代码中的某个位置,文本块!我知道了。谢谢! – drozzy 2010-03-17 21:41:27

3

我会想你是在谈论英特尔指令?在这种情况下,任何堆栈/帧指针都不会发生任何变化,代码只是在相同的上下文中继续执行,但在新地址处继续执行。

我想这个答案有一些注意事项 - 它可能导致使用jmp指令的任务切换,在这种情况下,可能会发生各种疯狂的东西。您可能需要阅读所有文档的详细信息。该Intel Software Developer's Manual有所有的细节:

  • jmp文档中卷2A
  • 7.3任务卷3A开关

编辑:指的是你对不更新跳跃问题。

能够跳过你的代码,而无需修改堆栈&帧指针。例如,与C代码中的goto相同 - 您可以跳过所有函数而不需要修改执行上下文。

+0

哇...我完全失去了。让我想想。更新了问题... – drozzy 2010-03-17 21:03:42

+0

那些在我的脑海里有点... – drozzy 2010-03-17 21:10:21

+0

请注意,AFAIK没有操作系统实际上使用任务。 – 2010-03-17 21:24:20

3

我们如何可以跳转到不同的地址在内存中,而不是更新我们的框架和堆栈指针...

由于指令指针(EIP)存储在不同的寄存器从框架和堆栈指针(esp,ebp)。改变一个不会影响其他人(通常)。

+0

好的谢谢。我想我会提出一个更具体的问题,绘制堆栈帧等,然后再问一次。如果只有我可以很容易地画出他们的地方... – drozzy 2010-03-17 21:11:10

2

JMP是组装的goto,与所有的暗示。

有时候,你只需要启动从不同的地址执行。

3

只是注意:在x86上,有许多种“JMP”指令。正如Carl指出的那样,最常见的是“本地”jmp,它只是简单地改变EIP寄存器的值,所以堆栈帧根本不被触及。我假设你是在谈论这种类型的JMP的,因为它是一个装配有语法像产生:

jmp label 
... 

label: 

但也有“远”跳,这也影响了CS段寄存器。如果处理器处于实模式,它只不过是CS:IP寄存器的变化(只是一个“较大的”跳转),但在保护模式下,CS段具有非常不同且更复杂的功能:它被解释为描述符呼叫/任务/中断门,即指数在定义一样的权限级别很多事情描述符表,任务...根据具体的描述,一个特权等级升级可能发生,或者也是一个“硬件任务”开关。这可能会导致上下文更改。除非您正在编程操作系统的核心,否则通常不会在保护模式下发现较远的跳转。创建段描述符几乎总是一个内核的工作。

问候

+0

+1为实际解释本地跳 – zebrabox 2010-03-17 21:26:12