当程序集有像 jmp f 这样的指令时,堆栈和帧指针会发生什么?
我是说 - f 是内存中的标签吗?我们如何跳转到内存中的不同地址,而不是更新我们的帧和堆栈指针...
编辑:我说的是英特尔x86汇编是的:)答案 0 :(得分:6)
堆栈和帧指针处理数据的位置。 jmp
说明涉及代码的位置。除非发生激烈的事情,否则不应影响另一方。这是一个激烈的事情清单:
jmp
。 就是这样。即使那些案例也会更改堆栈,因为它们涉及某种上下文切换,无论是新任务还是某些异常处理程序。
另请注意,我所知道的操作系统不使用CPU的任务切换功能。它通常用软件实现。
答案 1 :(得分:3)
我猜你在谈论英特尔指令?在这种情况下,任何堆栈/帧指针都没有发生,代码只是在相同的上下文中继续执行,但是在新地址处。
我想这个答案有一些警告 - 可能会导致使用jmp指令进行任务切换,在这种情况下,可能会发生各种疯狂的事情。您可能希望阅读文档以获取所有详细信息。 Intel Software Developer's Manual包含所有详细信息:
jmp
文件编辑:提及有关跳跃而不更新的问题。
你 能够在不修改堆栈的情况下跳转代码。帧指针。例如,它与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
,只是暗示着这一点。
有时你只需要从不同的地址开始执行。