汇编代码是否忽略const关键字?

时间:2013-07-12 21:41:05

标签: c assembly compiler-construction const

在c项目中使用(链接)汇编代码时忽略在C数据类型和函数之前声明的 const 关键字吗?它可以修改数据类型的内容吗?

5 个答案:

答案 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