是否有可能访问32-位寄存器在C?
-
26-09-2019 - |
题
是否有可能访问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)
或者你可以用大会程序。
使用 大会的语言, 有(至少)三种可能性:
- 一个单独的。asm源文件,该文件是联系在一起的程序。大会的惯例是从C喜欢正常的功能。这可能是最常用的方法和它具有的优点是,硬件的依赖功能都是分离的应用程序的代码。
- 在线会
- 固有的职能,执行个别组件的语言说明。这具有的优点是,大会语言的指令可以直接访问的任何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等,其中精确地发明了以抽象底层机器和渲染程序更多的机器无关。
我怀疑你正试图执行的东西,但不知道如何使用传统的方式来做到这一点。
到寄存器许多接入隐藏在更高级别的结构或系统或库调用,它可以让你避免编码“脏部分”。告诉我们更多关于你想要做什么,我们可能会建议你的选择。