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.我已经在这里发布了类似的答案.
您想要访问哪些寄存器?
通常无法从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例程.
对于使用汇编语言,有(至少)三种可能性: