是否可以在C中访问32位寄存器?

C4t*_*Win 11 c assembly mingw inline-assembly cpu-registers

是否可以在C中访问32位寄存器?如果是的话,怎么样?如果没有,那么有没有办法在C中嵌入汇编代码?顺便说一下,我正在使用MinGW编译器.提前致谢!

jwe*_*ich 15

如果您只想阅读寄存器,您可以简单地:

register int ecx asm("ecx");
Run Code Online (Sandbox Code Playgroud)

显然它与实例化有关.

另一种方法是使用内联汇编.例如:

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

这会将ecx值存储到变量中value.我已经在这里发布了类似的答案.


Pau*_*liL 7

您想要访问哪些寄存器?

通常无法从C访问通用寄存器.您可以在函数中声明寄存器变量,但不指定使用哪个特定寄存器.此外,大多数编译器忽略register关键字并自动优化寄存器使用.

在嵌入式系统中,通常需要访问外设寄存器(例如定时器,DMA控制器,I/O引脚).这些寄存器通常是内存映射的,因此可以从C访问它们...

通过定义指针:

volatile unsigned int *control_register_ptr = (unsigned int*) 0x00000178;
Run Code Online (Sandbox Code Playgroud)

或使用预处理器:

#define control_register (*(unsigned int*) 0x00000178)
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用Assembly例程.

对于使用汇编语言,有(至少)三种可能性:

  1. 与程序链接的单独.asm源文件.汇编例程从C调用,就像普通函数一样.这可能是最常用的方法,它的优点是依赖于hw的函数与应用程序代码分离.
  2. 在线组装
  3. 执行各个汇编语言指令的内部函数.这具有以下优点:汇编语言指令可以直接访问任何C变量.