上下文保存–​​如何读取C中的段寄存器和指令指针?

时间:2019-02-02 00:35:00

标签: c assembly

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

    register int *cs asm ("cs");

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

1 个答案:

答案 0 :(得分:1)

  

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

您当然可以保存cseip。但是...

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

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

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

  • ...你觉得什么,当你恢复这些寄存器,会发生什么?

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

    您将陷入无尽的循环...

    这真的是你想要做什么?

  

我想创建一个程序,它保存寄存器组 - 进程上下文

register int *cs asm ("cs");

现在它变得非常可怕:

如果您确实想编写一些代码来保存CPU上下文(例如,在“低级” C中手动实现try-catch机制),则应在汇编器。

请勿尝试在C函数中使用内联汇编来编写代码!

否则你不知道的“编译”的C代码如何与汇编代码交互;这极有可能是你的程序将无法正常工作。