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

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

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

register int ecx asm("ecx"); 

显然它与实例化有关。

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

 asm("movl %%ecx, %0;" : "=r" (value) : ); 

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

您想要访问哪些寄存器?

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

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

通过定义指针:

 volatile unsigned int *control_register_ptr = (unsigned int*) 0x00000178; 

或者使用预处理器:

 #define control_register (*(unsigned int*) 0x00000178) 

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

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

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

您可以在C中嵌入程序集

http://en.wikipedia.org/wiki/Inline_assembler

来自维基百科的例子

extern int errno;

 int funcname(int arg1, int *arg2, int arg3) { int res; __asm__ volatile( "int $0x80" /* make the request to the OS */ : "=a" (res) /* return result in eax ("a") */ "+b" (arg1), /* pass arg1 in ebx ("b") */ "+c" (arg2), /* pass arg2 in ecx ("c") */ "+d" (arg3) /* pass arg3 in edx ("d") */ : "a" (128) /* pass system call number in eax ("a") */ : "memory", "cc"); /* announce to the compiler that the memory and condition codes have been modified */ /* The operating system will return a negative value on error; * wrappers return -1 on error and set the errno global variable */ if (-125 <= res && res < 0) { errno = -res; res = -1; } return res; } 

我认为你不能直接做到这一点。 您可以使用以下代码执行内联汇编:

 asm ( "movl $0, %%ebx;" "movl $1, %%eax;" ); 

如果您使用的是32位处理器并且使用了足够的编译器,那么是的。 确切的方法取决于您编程的特定系统和编译器,当然这将使您的代码尽可能不可移植。

在使用MinGW的情况下,您应该查看GCC的内联汇编语法 。

你当然可以。 “MinGW”(gcc)允许(与其他编译器一样)内联汇编,正如其他答案已经显示的那样。 哪个程序集,它取决于你的系统的CPU(概率99.99%,它是x86)。 这使得您的程序无法在其他处理器上移植(如果您知道自己在做什么以及为什么这么做,那就不是那么糟糕)。

关于gcc程序集的相关页面在这里和这里 ,如果你想,也在这里 。 不要忘记它不能具体,因为它依赖于体系结构(gcc可以编译几个cpus)

通常不需要从以高级语言编写的程序访问CPU寄存器:高级语言,如C,Pascal等,其中精确发明以抽象底层机器并使程序更加机器化 – 独立。

我怀疑你正在尝试执行某些操作,但不知道如何使用传统方法来执行此操作。

许多对寄存器的访问都隐藏在更高级别的结构或系统或库调用中,这使您可以避免编写“脏部分”。 告诉我们更多关于你想做什么的事情,我们可能会建议你一个替代方案。