寄存器在C语言中是如何使用的?

寄存器在C语言中是如何使用的?,c,linux,linux-kernel,C,Linux,Linux Kernel,与用于指向页面目录的CR3寄存器类似。Linux也使用分页,并且是用C编写的,但是这些寄存器如何在C中使用(如何使用C选择特定的寄存器)?C语言无法访问特定的处理器寄存器。这一切都取决于编译器 要访问特定寄存器,您必须至少在汇编程序中编写这部分代码。您所说的寄存器不是语言的属性,而是运行程序的硬件的属性。我相信你说的是x86类型的硬件。cr0-4和其他特定的REG是操作系统的属性,由操作系统管理,包括分页表 因此,该语言不提供访问特定于硬件的寄存器的方法。唯一的方法是编写汇编代码(特定于硬件)来

与用于指向页面目录的CR3寄存器类似。Linux也使用分页,并且是用C编写的,但是这些寄存器如何在C中使用(如何使用C选择特定的寄存器)?

C语言无法访问特定的处理器寄存器。这一切都取决于编译器


要访问特定寄存器,您必须至少在汇编程序中编写这部分代码。

您所说的寄存器不是语言的属性,而是运行程序的硬件的属性。我相信你说的是x86类型的硬件。cr0-4和其他特定的REG是操作系统的属性,由操作系统管理,包括分页表


因此,该语言不提供访问特定于硬件的寄存器的方法。唯一的方法是编写汇编代码(特定于硬件)来操作它们。该语言提供的唯一功能是
asm()
运算符,它允许在程序中插入汇编代码

标准C不提供任何直接访问处理器寄存器的工具。一些实现可能提供扩展,允许您在C代码中嵌入汇编代码(例如gcc提供的扩展)


一般来说,如果您需要直接访问处理器寄存器(或其他特定于硬件的位置),您应该在汇编程序中编写该例程,并将其链接到更大的程序中

如果你想直接使用寄存器,你需要用汇编语言编写代码。宏是如何初始化的?(我的意思是我读了一些宏来选择寄存器),而在linux分页的源代码中我还没有看到汇编语言。这段代码是如何工作的?你到底想实现什么。通常在C语言中不需要使用CPU寄存器,顺便说一句,C语言C不指定如何访问寄存器。但许多编译器都有扩展,允许您直接寻址CPU寄存器。@karansharma然后您没有仔细查看。为了编写cr3,在arch/x86/include/system.h中有一个名为
write\u cr3
的函数。它有内联汇编程序。(这是在我所使用的特定版本的linux上,可能在其他版本中有所不同)谢谢Art,我明白了。我的意思是,你的回答并没有回答这个问题,你应该把它作为评论发布。@MichaelWalz-但它确实回答了这个问题。在纯C的范围内询问OP。纯C不允许。因此,这就是答案。简短并不影响它。@StoryTeller好的,也许,我会删除我的评论。@SisterFister我删除了我的评论,你也可以删除你的评论。@StoryTeller因为你毕竟是对的,我不应该一开始就发布它。
\u asm\u
是特定实现提供的扩展;它不是标准C语言定义的一部分。@JohnBode right,标准定义是
asm()
。我修复了它。
asm
作为通用扩展在J.5.10中列出,但它不是核心语言或库的一部分。正如J.5/1中所说:“以下扩展在许多系统中广泛使用,但并非可移植到所有实现中。”@JohnBode它在asm声明的
10.4中定义。我认为,这足以使它成为语言的一部分。虽然它是有条件支持的
。您正在查看哪个文档?我在世界上任何地方都看不到