首页 > 解决方案 > 上下文保存——如何读取 C 中的段寄存器和指令指针?

问题描述

你好。我想创建一个程序来保存寄存器集——进程上下文。当我尝试读取 CS 寄存器时,我的编译器和 IDE 告诉我,该寄存器“CS”不存在。

    register int *cs asm ("cs");

我做对了吗?保存进程上下文意味着保存每个寄存器——尤其是代码段(以及其他段)——需要这些寄存器来恢复进程映像并从上次执行停止的地方开始执行。

标签: cassembly

解决方案


保存进程上下文意味着保存每个寄存器

当然你可以保存cseip。然而 ...

  • ...这两个寄存器包含当前正在执行的指令的位置(地址)。

    这意味着这些寄存器将始终包含保存上下文寄存器的代码的地址。

    当这些寄存器总是包含相同的值时,为什么要存储这些信息?

  • ...您认为恢复这些寄存器时会发生什么?

    因为这两个寄存器包含当前正在执行的指令的地址,所以“恢复”这两个寄存器的唯一方法是跳转到保存寄存器值的指令。

    你会陷入无限循环......

    这真的是你想做的吗?

我想创建一个程序来保存寄存器集——进程上下文。

register int *cs asm ("cs");

现在它变得非常可怕:

如果您真的想编写一些代码来保存 CPU 上下文(例如,在“低级”C 中手动实现try-机制),您应该在汇编程序中编写完整的函数。catch

不要尝试在 C 函数中使用内联汇编来编写它!

否则你不知道“编译”的 C 代码将如何与汇编代码交互;您的程序很可能无法运行。


推荐阅读