可以在C语言中访问32位寄存器吗?

可以在C语言中访问32位寄存器吗?,c,assembly,mingw,inline-assembly,cpu-registers,C,Assembly,Mingw,Inline Assembly,Cpu Registers,可以在C语言中访问32位寄存器吗?如果是,怎么做?如果没有,那么有没有办法在C中嵌入汇编代码?顺便说一下,我用的是MinGW编译器。 提前谢谢 您可以在C中嵌入程序集 维基百科的例子 外部内部错误 int funcname(int arg1, int *arg2, int arg3) { int res; __asm__ volatile( "int $0x80" /* make the request to the OS */ : "=a" (res)

可以在C语言中访问32位寄存器吗?如果是,怎么做?如果没有,那么有没有办法在C中嵌入汇编代码?顺便说一下,我用的是MinGW编译器。
提前谢谢

您可以在C中嵌入程序集

维基百科的例子

外部内部错误

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;
}
int funcname(int arg1,int*arg2,int arg3)
{
国际关系;
__反复无常(
“int$0x80”/*向操作系统发出请求*/
:“=a”(res)/*返回eax中的结果(“a”)*/
“+b”(arg1),/*在ebx(“b”)中通过arg1”*/
“+c”(arg2),/*通过ecx中的arg2(“c”)*/
“+d”(arg3)/*通过edx中的arg3(“d”)*/
:“a”(128)/*通过eax中的系统呼叫号码(“a”)*/
:“memory”,“cc”);/*向编译器宣布内存和条件代码已被修改*/
/*操作系统将在出错时返回负值;
*wrappers在出错时返回-1,并设置errno全局变量*/

如果(-125我认为您不能直接执行它们。您可以使用以下代码执行内联汇编:

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

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


在使用MinGW的情况下,您应该看看。

通常不需要从用高级语言编写的程序中访问CPU寄存器:高级语言,如C、Pascal等,这些语言是为了抽象底层机器并使程序更独立于机器而发明的

我怀疑你正在尝试做一些事情,但不知道如何用传统的方式来做


许多对寄存器的访问隐藏在更高级别的构造或系统或库调用中,这样可以避免对“脏部分”进行编码。请告诉我们更多您想要做的事情,我们可能会建议您一种替代方法。

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

register int ecx asm("ecx");
显然,它与实例化有关

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

asm("movl %%ecx, %0;" : "=r" (value) : );
这将
ecx
值存储到变量
值中。我已经发布了一个类似的答案。

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


讨论gcc汇编的相关页面是和,如果您愿意,也可以。不要忘记它不能是特定的,因为它依赖于体系结构(gcc可以为多个CPU编译)

您希望访问哪些寄存器

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

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

通过定义指针:

volatile unsigned int *control_register_ptr = (unsigned int*) 0x00000178;
或使用预处理器:

#define control_register (*(unsigned int*) 0x00000178)
或者,您可以使用汇编例程

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

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

  • 告诉我们更多关于您的需求:为什么要访问CPU寄存器???您可以使用GetThreadContext及其兄弟SetThreadContext间接获取和设置windows上的寄存器,而无需任何asm:不,我确实知道我在做什么。但感谢您的帮助。:)非常感谢链接!非常有用。非常感谢代码示例。我需要的确切信息。;)如何获得0x00000178号码?