可以在C语言中访问32位寄存器吗?
可以在C语言中访问32位寄存器吗?如果是,怎么做?如果没有,那么有没有办法在C中嵌入汇编代码?顺便说一下,我用的是MinGW编译器。可以在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中嵌入程序集 维基百科的例子 外部内部错误
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号码?