保存上下文 - 如何阅读用C段寄存器和指令指针?

问题描述 投票:-1回答:1

你好。我想创建一个程序,从而节省了寄存器集 - 进程上下文。当我尝试读取CS寄存器,我的编译器和IDE告诉我,那注册“CS”不存在。

    register int *cs asm ("cs");

我这样做对吗?保存过程中是指节约每寄存器 - 尤其是代码段(和其它段一样) - 这些寄存器都需要恢复过程图像,并且开始执行,其中最后一次执行停止。

c assembly
1个回答
1
投票

保存过程中是指节约每寄存器

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

  • ...这两个寄存器含有当前正在执行的指令的位置(地址)。 这意味着,这些寄存器总是包含保存上下文寄存器的代码的地址。 你为什么要保存这些信息时,这些寄存器总是包含相同的值?
  • ......你觉得什么,当你恢复这些寄存器会发生什么? 因为这两个寄存器包含当前正在执行的指令的地址,只有这样,才能“恢复”这两个寄存器是跳转到该保存的寄存器的值的指令。 你会遇到一个无限循环...... 这真的是你想要做什么?

我想创建一个程序,从而节省了寄存器集 - 进程上下文。

register int *cs asm ("cs");

现在,它变得非常可怕的:

如果你真的想编写一些代码,节省了CPU上下文(例如,用于手动实现在“低级别” C一try-catch机制),你应该写在汇编程序的完整功能。

不要尝试写中的C函数这个内联汇编!

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

© www.soinside.com 2019 - 2024. All rights reserved.