在 ac 项目中使用(链接)时,汇编代码是否会忽略C 数据类型和函数之前声明的const关键字?它可以修改数据类型的内容吗?
5 回答
在 ac 项目中使用(链接)时,汇编代码是否会忽略 C 数据类型和函数之前声明的 const 关键字?
是的,const
汇编代码完全忽略了关键字。
它可以修改数据类型的内容吗?
如果编译器能够将位置放置const
在只读段中,则试图修改它的汇编代码将导致段错误。否则,将导致不可预测的行为,因为编译器可能已经优化了部分代码,而不是其他部分,假设const
位置没有被修改。
它可以修改数据类型的内容吗?
也许,也许不是。如果声明了原始对象,const
那么编译器可能会将其发送到只读数据段中,该数据段将在运行时加载到只读内存页面中。写入该页面,即使是从程序集写入,也会触发运行时异常(访问冲突或分段错误)。
您不会收到编译时错误,但在运行时您的程序可能会崩溃或行为异常。
Assembly 使用您在 C 中声明的数据类型来更好地优化它在内存中存储信息的方式。一切都在一天结束时以二进制形式编写(int、long、char 等),因此一旦进入低级代码就没有数据类型。
The question is not very precise. What does "ignores" mean?
Assembly language does not have the same concept of const
as C language does. So, assembly cannot ignore it. It simply has no idea about it.
Yet the assembly code generated by C compiler for a C program might easily be affected by the placement of const
keywords in your C program.
In other words, assembly code can be affected by const
keywords. But once that assembly code is built, the const
keyword is no longer necessary.
To say that assembler can modify something declared as const
is not exactly correct either. If you declare a variable as const
, in some cases the compiler might be smart enough to eliminate that variable entirely, replacing it with immediate value of that variable. This means that that const
variable might disappear from the final code entirely, leaving nothing for the assembly code to "modify".
GCC 将标记为 const 的全局变量放在称为 .rodata 的单独部分中。.rodata 也用于存储字符串常量。
由于 .rodata 部分的内容不会被修改,因此可以将它们放在 Flash 中。必须修改链接描述文件以适应这种情况。
#include <stdio.h>
const int a = 10 ;
int main ( void ) {
return a ;
}
.section .rodata
.align 4
a:
.long 10
gcc 与 00 :
movl a(%rip), %eax // variabile constant
addq $32, %rsp
popq %rbp
gcc 与 O3 :
movl $10, %eax // numeric constant
addq $40, %rsp
ret