彙編代碼在c項目中使用(鏈接)時忽略const在C數據類型和函數之前聲明關鍵字?它可以修改數據類型的內容嗎?彙編代碼忽略const關鍵字嗎?
回答
彙編代碼在c項目中使用(鏈接)時忽略const 在C數據類型和函數之前聲明的關鍵字?
是的,const
關鍵字完全被彙編代碼忽略。
它可以修改數據類型的內容?
如果編譯器能夠放在只讀段const
位置,然後彙編代碼試圖修改它會導致分段錯誤。否則,會導致不可預知的行爲,因爲在const
位置未被修改的假設下,編譯器可能會優化部分代碼,但不會有其他代碼。
它可以修改數據類型的內容?
也許,也許不是。如果原始對象被聲明爲const
,那麼編譯器可能會將其發送到只讀數據段,該數據段將在運行時加載到只讀內存頁中。即使從彙編寫入該頁面也會觸發運行時異常(訪問衝突或分段錯誤)。
您不會收到編譯時錯誤,但在運行時您的程序可能會崩潰或行爲不正常。
程序集使用您在C中聲明的數據類型以更好地優化它將信息存儲在內存中的方式。一切都是在一天結束時以二進制形式寫入的(int,long,char等),所以一旦到達低級代碼就沒有數據類型。
這個問題不是很精確。 「忽略」是什麼意思?
彙編語言不像C語言那樣具有與const
相同的概念。所以,彙編不能忽視它。它根本不知道它。
然而,由C編譯器爲C程序生成的彙編代碼可能很容易受到C程序中const
關鍵字的位置影響。
換句話說,彙編代碼可以是受影響通過const
關鍵字。但是一旦構建了彙編代碼,關鍵字const
就不再需要了。
說彙編器可以修改聲明爲const
的東西也不完全正確。如果您將變量聲明爲const
,則在某些情況下,編譯器可能足夠聰明以完全消除該變量,並將其替換爲該變量的即時值。這意味着const
變量可能會從最終代碼中完全消失,因此彙編代碼不會「修改」。
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
- 1. 忽略彙編程序函數的彙編程序關鍵字
- 2. 空字符彙編代碼
- 3. AppleScript Objective-C忽略「quit」關鍵字
- 4. 彙編代碼
- 5. JFormDesigner忽略編碼
- 6. WebBrowser忽略代碼
- 7. 忽略根JSON關鍵
- 8. Webpack編譯忽略源代碼更改
- 9. 爲什麼EntityFramework代碼首先忽略代碼中設置的關鍵值
- 10. 反彙編程序GLOBAL關鍵字
- 11. 關於gcc生成的彙編代碼(彙編代碼不正確?)
- 12. Qt忽略const說明符
- 13. iOS彙編代碼
- 14. 彙編代碼MOVS
- 15. C++彙編代碼
- 16. 彙編代碼C
- 17. x86彙編代碼
- 18. ARM彙編代碼
- 19. GMP-彙編代碼?編譯代碼
- 20. 彙編&C - 翻譯C'S代碼彙編
- 21. JavaScript中的const關鍵字:
- 22. 位置const關鍵字
- 23. const關鍵字位置
- 24. const關鍵字在objective-c
- 25. const關鍵字使用C++
- 26. 反編譯彙編代碼
- 27. XMLLite程序忽略編碼
- 28. 批編碼 - 行被忽略?
- 29. IA32彙編代碼Y86彙編代碼:leal指令
- 30. 轉換GCC彙編代碼爲armasm彙編代碼
好吧,我會闡述的情況。我有一個.asm文件鏈接到我的c項目,我將常量參數傳遞給我的c源文件中的.asm文件中的函數,並且我傳遞的const數據類型的內容正在改變。 – annunarcist