Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有可寻址GPR文件、寄存器变量地址以及内存和寄存器之间别名的CPU 背景_C_Language Lawyer_Avr_Avr Gcc - Fatal编程技术网

具有可寻址GPR文件、寄存器变量地址以及内存和寄存器之间别名的CPU 背景

具有可寻址GPR文件、寄存器变量地址以及内存和寄存器之间别名的CPU 背景,c,language-lawyer,avr,avr-gcc,C,Language Lawyer,Avr,Avr Gcc,有些CPU(如)有一个通用寄存器文件,该文件也可作为主存的一部分寻址——参见第7.4节中的图7-2和图后面的段落 WG14在想什么? 既然如此,为什么C委员会选择作出决定 register int ri; int* pi = &ri; 根据第6.7.1节脚注101,是否普遍存在格式错误?考虑到上面的代码在至少一个处理器上是有意义的,并且C向后弯曲以适应远比AVR更陌生(也更稀少!)的目标,那么未定义或实现定义的行为是否更有意义呢 101)实现可以将任何寄存器声明简单地视为自动 宣言。但

有些CPU(如)有一个通用寄存器文件,该文件也可作为主存的一部分寻址——参见第7.4节中的图7-2和图后面的段落

WG14在想什么? 既然如此,为什么C委员会选择作出决定

register int ri;
int* pi = &ri;
根据第6.7.1节脚注101,是否普遍存在格式错误?考虑到上面的代码在至少一个处理器上是有意义的,并且C向后弯曲以适应远比AVR更陌生(也更稀少!)的目标,那么未定义或实现定义的行为是否更有意义呢

101)实现可以将任何
寄存器
声明简单地视为
自动
宣言。但是,无论是否实际使用了可寻址存储器,地址 使用存储类说明符
register
声明的对象的任何部分的 显式计算(使用6.5.3.2中讨论的一元
运算符)
或者隐式地(通过将数组名转换为指针,如6.3.2.1所述)。因此
可以应用于使用存储类说明符声明的数组的唯一运算符
寄存器
sizeof

我只是通过一个指针改变了一个CPU寄存器。哇?! 此外,使用GCC显式寄存器变量扩展,可以指示编译器将变量放入特定寄存器中。在这种情况下,您可以获得一个带有寄存器变量别名的指针,如下所示:

register int ri asm("r15") = 0;
int* pi = (int*)0x15;
/* pi now aliases ri */
*pi = 42;
/* ri is 42 now */
assert(ri == 42);

GCC如何处理此类案件?我感到非常奇怪的是,像这样的东西还没有被考虑过……或者说是吗?

C是一种抽象语言,它是在不了解最终将实现它的机器的情况下定义的。C的定义并不假定底层机器甚至会有常规形式的寄存器(或堆栈、连续内存,或许多其他与实际机器上存在的问题无关的东西)

寄存器
并不意味着应为变量分配一个机器寄存器。关键字的意思是变量不能有地址;理论上,编译器能够对其执行更好的优化,因为它减少了可能修改变量的路径数。获取
寄存器
变量的地址在C中没有意义,不管它在哪个处理器上运行,因为
寄存器
是(以它启用的最明显的优化命名的),这特别意味着不应该获取该地址。这就是它的全部含义


AVR的智能编译器应该能够进行优化,而无需您提示(实际上,该关键字毫无用处,因为任何半正派的编译器都可以检测出它何时适用,因为基本上没有定义良好的方法来引用
auto
对象而不显式获取其地址)C是一种抽象语言,它的定义不知道最终将实现它的机器。C的定义并不假定底层机器甚至会有常规形式的寄存器(或堆栈、连续内存,或许多其他与实际机器上存在的这个问题无关的东西)

关键是
寄存器
并不意味着应该为变量分配一个机器寄存器。关键字的意思是变量不能有地址;编译器理论上可以对其执行更好的优化,因为它减少了变量可以通过的路径数TIALY可以修改。在C中,获取
寄存器
变量的地址没有意义,不管它运行在哪个处理器上,因为
寄存器
是(以它启用的最明显的优化命名),这特别意味着不应获取该地址。这就是它的全部含义


AVR的智能编译器应该能够进行优化,而无需您提示(实际上,该关键字毫无用处,因为任何半正派的编译器都可以检测到它何时适用,因为基本上没有定义良好的方法来引用
auto
对象而不显式地获取其地址)。

第一个示例代码段的用途/意义是什么(即采用非特定登记簿的地址)?在第一个代码段中,
pi
将被设置为寄存器的内存地址——在AVR上,这与寄存器号相同。至于它的用途?一种可能是在复杂的内部循环中保留一个重要变量,以便快速访问,但仍然允许该内部循环的子例程修改它(好像它已经被关闭了一样)。你应该问的问题是为什么你的GCC没有将其作为扩展来实现。默认情况下,GCC不符合任何标准,因此不需要将你的第一个示例视为错误。(即使在严格遵从性的情况下,大多数GCC只需要发出诊断,它仍然可以接受您的示例,并警告您它不遵从。)@罗斯里奇:听起来我应该向GCC团队提出一个功能请求…Bugzilla是否是正确的地点?也许,但是您需要对它为什么有用做一个更好的例子。您需要展示一些令人信服的源代码示例,这些示例无法用其他方式使用现有编译器功能实现已经实现这一点的mpiler会很好。我不确定提出正式增强请求的正确位置是什么,但首先在GCC邮件列表上讨论它可能是一个好主意。您的第一个示例片段(即获取非特定寄存器的地址)的用途/意义是什么