2

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

4

5 回答 5

7

在 ac 项目中使用(链接)时,汇编代码是否会忽略 C 数据类型和函数之前声明的 const 关键字?

是的,const汇编代码完全忽略了关键字。

它可以修改数据类型的内容吗?

如果编译器能够将位置放置const在只读段中,则试图修改它的汇编代码将导致段错误。否则,将导致不可预测的行为,因为编译器可能已经优化了部分代码,而不是其他部分,假设const位置没有被修改。

于 2013-07-12T21:44:25.667 回答
3

它可以修改数据类型的内容吗?

也许,也许不是。如果声明了原始对象,const那么编译器可能会将其发送到只读数据段中,该数据段将在运行时加载到只读内存页面中。写入该页面,即使是从程序集写入,也会触发运行时异常(访问冲突或分段错误)。

您不会收到编译时错误,但在运行时您的程序可能会崩溃或行为异常。

于 2013-07-12T21:45:04.850 回答
1

Assembly 使用您在 C 中声明的数据类型来更好地优化它在内存中存储信息的方式。一切都在一天结束时以二进制形式编写(int、long、char 等),因此一旦进入低级代码就没有数据类型。

于 2013-07-12T21:45:22.943 回答
1

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".

于 2013-07-12T21:58:54.833 回答
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 与 00 :

    movl    a(%rip), %eax   // variabile constant
    addq    $32, %rsp
    popq    %rbp

gcc 与 O3 :

    movl    $10, %eax       // numeric constant
    addq    $40, %rsp
    ret
于 2013-07-13T13:58:40.033 回答