我正在學習AT & T程序集,我知道可以使用.int/.long聲明數組/變量,或者使用.equ聲明一個符號,這將被程序集取代。GCC編譯代碼:爲什麼整數聲明需要幾個語句?
它們被聲明爲.data節(初始化)或.bss節(未初始化)。
但是,當我使用gcc編譯一個非常簡單的.c文件並帶有'-S'命令行選項來檢查反彙編代碼時,我注意到: (1).s沒有同時使用.data和.bss ,但只有.data (2)整數(.long)的聲明需要幾個語句,其中一些對我來說似乎是多餘的或無用的。
如下所示,我按照我的問題添加了一些評論。
$貓NC
int i=23;
int j;
int main(){
return 0;
}
$ GCC -S NC $貓NS
.file "n.c"
.globl i
.data
.align 4
.type i, @object #declare i, I think it's useless
.size i, 4 #There's '.long 23', we know it's 4 bytes, why need this line?
i:
.long 23 #Only this line is needed, I think
.comm j,4,4 #Why j is not put inside .bss .section?
.text
.globl main
.type main, @function
main:
.LFB0: #What does this symbol mean, I don't find it useful.
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0: #What does this symbol mean, I don't find it useful.
.size main, .-main
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609"
.section .note.GNU-stack,"",@progbits
我所有的問題都在上面的評論,我又再次強調這裏:
.type i, @object
.size i, 4
i:
.long 23
我真的覺得上面的代碼是多餘的,應該如此簡單:
i:
.long 23
此外,「j」沒有符號標記,也沒有放在.bss節中。
我有什麼不對嗎?請幫助糾正。非常感謝。
你最好用'-fverbose-asm'編譯,也許還有'-O' –
你的問題不是理解ATT程序集,而是理解ELF格式的複雜性,這很複雜(你需要幾天的閱讀理解它)。 –
如果您只想看到沒有所有可預測的行的asm,您不必擔心,請參閱[我對此問題的回答](http://stackoverflow.com/questions/38552116/how-to-remove -gcc-clang-assembly-output)(或者把你的代碼放在http://gcc.godbolt中。org /) –