是否有可能访问32-位寄存器在C?如果是,怎么样?如果没有,那么是否有任何方法嵌入大会码在C?我使用的MinGW编译器,通过这种方式。在此先感谢!

有帮助吗?

解决方案

如果你想只读寄存器,可以简单:

register int ecx asm("ecx");

显然,这是依赖于实例化。

另一种方式是使用内联组件。例如:

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

此存储ecx值入变量value。我已经发布了类似的回答这里

其他提示

其寄存你想访问?

一般用寄存器 通常不可能从C。你可以声明登记册中的变量的一个函数,但这并不指定哪些特定的注册使用。另外,大多数编译器忽略登记的关键字和优化登记册使用情况自动进行。

在嵌入式系统中,常常有必要访问 周寄存器 (诸如计时器,DMA控制器,I/O销).这种登记通常存映,因此他们可以从C...

通过界定指针:

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

或者通过使用预处理:

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

或者你可以用大会程序。

使用 大会的语言, 有(至少)三种可能性:

  1. 一个单独的。asm源文件,该文件是联系在一起的程序。大会的惯例是从C喜欢正常的功能。这可能是最常用的方法和它具有的优点是,硬件的依赖功能都是分离的应用程序的代码。
  2. 在线会
  3. 固有的职能,执行个别组件的语言说明。这具有的优点是,大会语言的指令可以直接访问的任何C的变量。

可以装配用C嵌入

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

例如,从维基百科

的extern INT错误号;

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)允许(其他编译器)内联汇编,作为其他的答案已经显现。其装配,这取决于你的系统(概率99.99%,这是86)的CPU。这使得但是你的程序在其它处理器无法移植(不坏,如果你知道自己在做,为什么什么的)。

在谈论大会gcc的相关页面是这里这里,如果你愿意,还的此处。不要忘记,它不可能是特异性的,因为它是架构相关(GCC可以编译为多个CPU)

一般不存在需要存取从写在一个高级语言程序的CPU寄存器:高级语言,诸如C,Pascal等,其中精确地发明了以抽象底层机器和渲染程序更多的机器无关。

我怀疑你正试图执行的东西,但不知道如何使用传统的方式来做到这一点。

到寄存器许多接入隐藏在更高级别的结构或系统或库调用,它可以让你避免编码“脏部分”。告诉我们更多关于你想要做什么,我们可能会建议你的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top