在c项目中使用(链接)汇编代码时忽略在C数据类型和函数之前声明的 const 关键字吗?它可以修改数据类型的内容吗?
答案 0 :(得分:7)
在c项目中使用(链接)时汇编代码是否忽略const 在C数据类型和函数之前声明的关键字??
是的,汇编代码完全忽略了const
关键字。
并且可以修改数据类型的内容吗?
如果编译器能够在只读段中放置const
位置,那么尝试修改它的汇编代码将导致分段错误。否则,将导致不可预测的行为,因为在假设const
位置未被修改的情况下,编译器可能已经优化了代码的一部分,而不是其他部分。
答案 1 :(得分:3)
并且可以修改数据类型的内容吗?
也许,也许不是。如果原始对象被声明为const
,则编译器可能会将其发送到只读数据段,该数据段将在运行时加载到只读内存页中。即使从汇编语言写入该页面也会触发运行时异常(访问冲突或分段错误)。
您不会收到编译时错误,但在运行时,您的程序可能会崩溃或行为不正常。
答案 2 :(得分:1)
程序集使用您在C中声明的数据类型来更好地优化它在内存中存储信息的方式。一切都是在一天结束时用二进制编写的(int,long,char等),所以一旦你到达低级代码就没有数据类型。
答案 3 :(得分:1)
问题不是很精确。 “忽略”是什么意思?
汇编语言与C语言的概念不同const
。所以,装配不能忽视它。它根本不知道它。
然而,C编译器为C程序生成的汇编代码可能很容易受到C程序中const
个关键字的放置的影响。
换句话说,const
个关键字可以>影响汇编代码。但是,一旦构建了汇编代码,就不再需要const
关键字。
要说汇编程序可以修改声明为const
的东西也不完全正确。如果将变量声明为const
,则在某些情况下,编译器可能足够智能以完全消除该变量,将其替换为该变量的立即值。这意味着const
变量可能完全从最终代码中消失,不会为汇编代码留下任何“修改”。
答案 4 :(得分:0)
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 with 00:
movl a(%rip), %eax // variabile constant
addq $32, %rsp
popq %rbp
gcc with O3:
movl $10, %eax // numeric constant
addq $40, %rsp
ret