2013-07-12 54 views

回答

7

彙編代碼在c項目中使用(鏈接)時忽略const 在C數據類型和函數之前聲明的關鍵字?

是的,const關鍵字完全被彙編代碼忽略。

它可以修改數據類型的內容?

如果編譯器能夠放在只讀段const位置,然後彙編代碼試圖修改它會導致分段錯誤。否則,會導致不可預知的行爲,因爲在const位置未被修改的假設下,編譯器可能會優化部分代碼,但不會有其他代碼。

3

它可以修改數據類型的內容?

也許,也許不是。如果原始對象被聲明爲const,那麼編譯器可能會將其發送到只讀數據段,該數據段將在運行時加載到只讀內存頁中。即使從彙編寫入該頁面也會觸發運行時異常(訪問衝突或分段錯誤)。

您不會收到編譯時錯誤,但在運行時您的程序可能會崩潰或行爲不正常。

1

程序集使用您在C中聲明的數據類型以更好地優化它將信息存儲在內存中的方式。一切都是在一天結束時以二進制形式寫入的(int,long,char等),所以一旦到達低級代碼就沒有數據類型。

1

這個問題不是很精確。 「忽略」是什麼意思?

彙編語言不像C語言那樣具有與const相同的概念。所以,彙編不能忽視它。它根本不知道它。

然而,由C編譯器爲C程序生成的彙編代碼可能很容易受到C程序中const關鍵字的位置影響。

換句話說,彙編代碼可以是受影響通過const關鍵字。但是一旦構建了彙編代碼,關鍵字const就不再需要了。

說彙編器可以修改聲明爲const的東西也不完全正確。如果您將變量聲明爲const,則在某些情況下,編譯器可能足夠聰明以完全消除該變量,並將其替換爲該變量的即時值。這意味着const變量可能會從最終代碼中完全消失,因此彙編代碼不會「修改」。

+0

好吧,我會闡述的情況。我有一個.asm文件鏈接到我的c項目,我將常量參數傳遞給我的c源文件中的.asm文件中的函數,並且我傳遞的const數據類型的內容正在改變。 – annunarcist

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