相关疑难解决方法(0)

如何确定堆栈中保存的值?

我正在做一些实验,并希望能够在系统调用期间查看堆栈中保存的内容(用户登陆过程的已保存状态).根据http://lxr.linux.no/#linux+v2.6.30.1/arch/x86/kernel/entry_32.S它表明寄存器的各种值都保存在堆栈指针的那些特定偏移处.这是我一直试图用来检查堆栈上保存的代码的代码(这是我创建的自定义系统调用):

asm("movl 0x1C(%esp), %ecx");
asm("movl %%ecx, %0" : "=r" (value));
Run Code Online (Sandbox Code Playgroud)

其中value是unsigned long.

截至目前,该值不是预期的值(它显示为ds的用户值保存0).

我是否正确访问堆栈指针的偏移量?

另一种可能性是我可以在内核中使用调试器(如GDB)来检查堆栈内容吗?我没有广泛使用调试,也不知道如何在内核中调试代码.任何帮助深表感谢.

c linux assembly system-calls inline-assembly

6
推荐指数
2
解决办法
1915
查看次数

C/Assembly:如何更改 CPU 寄存器中的单个位?

我是软件故障注入领域的新研究员,目前我的最终目标是编写一段简单的代码,能够更改 CPU 寄存器中的单个位。我想用 C 来做(在代码中包含一些程序集调用)。考虑到这一点,我在 Stack Overflow 中找到了这个关于如何访问 32 位 CPU 寄存器内容的好线程和简单示例:Is it possible to access 32-bit registers in C? 通过这种方式,我能够编写这个简单的代码:

#include <stdio.h>

int main()
{
    register int value;

    register int ecx asm("ecx");
    printf("Contents of ecx: %d\n", ecx);

    asm("movl %%ecx, %0;" : "=r" (value) : ); //Assembly: this stores the ecx value into the variable value
    printf("Contents of value: %d\n", value);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是对这个主题的一个很好的介绍,那里提供的答案给了我很好的洞察力和信息来源(我已经在阅读 GCC 文档),但现在我需要更进一步,即,我需要了解如何才能我更改了 CPU 寄存器中单个位的内容(或者至少,首先,更简单的事情:如何更改 CPU 寄存器值?)。如果有人能给我一个提示或告诉我寻找它的最合适的来源,我将不胜感激。

祝一切顺利,提前致谢,若昂

PS:不知道这是否有帮助,但我正在使用 CentOS 6.5 32 位系统(尽管 CPU 是 …

c assembly gcc inline-assembly cpu-registers

1
推荐指数
1
解决办法
7280
查看次数

如何在C中使用寄存器?

就像CR3寄存器一样,它用于指向页面目录.Linux也使用分页并用C语言编写,但这些寄存器如何在C中使用(如何使用C选择特定的寄存器)?

c linux linux-kernel

0
推荐指数
1
解决办法
134
查看次数