JMP对堆栈和帧指针做了什么?

时间:2010-03-17 20:59:51

标签: assembly x86

当程序集有像 jmp f 这样的指令时,堆栈和帧指针会发生什么?

我是说 - f 是内存中的标签吗?我们如何跳转到内存中的不同地址,而不是更新我们的帧和堆栈指针...

编辑:我说的是英特尔x86汇编是的:)

5 个答案:

答案 0 :(得分:6)

堆栈和帧指针处理数据位置jmp说明涉及代码位置。除非发生激烈的事情,否则不应影响另一方。这是一个激烈的事情清单:

  • 任务切换 - 由于使用任务门跳远
  • 错误 - 由于跳转到无效的新网页或跳出当前网段,或者试图非法更改权限的jmp
  • 陷阱 - 例如,由于代码断点。事实上,目前还没有其他陷阱。

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

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

答案 1 :(得分:3)

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

我想这个答案有一些警告 - 可能会导致使用jmp指令进行任务切换,在这种情况下,可能会发生各种疯狂的事情。您可能希望阅读文档以获取所有详细信息。 Intel Software Developer's Manual包含所有详细信息:

    第二卷
  • jmp文件
  • 第3A卷
  • 7.3任务切换

编辑:提及有关跳跃而不更新的问题。

能够在不修改堆栈的情况下跳转代码。帧指针。例如,它与C代码中的goto相同 - 您可以遍历函数而无需修改执行上下文。

答案 2 :(得分:3)

  

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

因为指令指针(eip)存储在与帧和堆栈指针(esp,ebp)不同的寄存器中。改变一个不会影响其他人(通常)。

答案 3 :(得分:3)

请注意:在x86中,有许多种“jmp”指令。最常见的是“本地”jmp,它只是改变了EIP寄存器的值,所以堆栈帧根本没有被触及,正如Carl指出的那样。我假设您正在讨论这种类型的jmp,因为它是汇编程序使用以下语法生成的:

jmp label
...

label:

但也存在“远”跳跃,这也会影响CS段寄存器。如果处理器处于实模式,它仍然只是CS:IP寄存器的变化(只是“更大”的跳转),但在保护模式下,CS段具有非常不同且复杂得多的功能:它被解释为描述符到CALL / TASK / INTERRUPT门,即描述符表中的索引,它定义了许多诸如权限级别,任务......根据特定描述符,可能发生权限级别升级,或者也可能是“硬件任务”切换。这可能会产生背景变化。除非您正在编写操作系统的核心,否则通常不会在受保护模式下找到远程跳转。创建段描述符几乎总是内核的工作。

此致

答案 4 :(得分:2)

JMP是汇编的goto,只是暗示着这一点。

有时你只需要从不同的地址开始执行。