【經(jīng)驗(yàn)分享】如何查看C++生成的匯編代碼?
想要真正的理解一段代碼到底是怎么執(zhí)行的,還是要從匯編的層面去看,那怎么得到一段c++代碼所對(duì)應(yīng)的匯編代碼呢,下面為你介紹三種方式。

1. gcc編譯生成XXX.s文件
一般來(lái)講,給你一個(gè)cpp文件,比如test.cpp,然后我們編譯都是直接g++ test.cpp這樣簡(jiǎn)單直接的方式,但其實(shí)它中間有很多個(gè)過(guò)程的,包含預(yù)處理、編譯、鏈接等過(guò)程,而這其中的編譯這個(gè)過(guò)程其實(shí)就是生成了匯編文件。
比如對(duì)于一個(gè)cpp文件,我們執(zhí)行下列命令:
這樣生成test.s就是test.cpp所對(duì)應(yīng)的匯編代碼,當(dāng)然我們也可以一步到位,直接使用g++ -S test.cpp -o test.s也是可以的。
2. 使用objdump命令得到匯編代碼
linux下的objdump命令用于從可執(zhí)行文件或者目標(biāo)文件中顯示某些信息,所以用它也可以得到可執(zhí)行文件對(duì)應(yīng)的匯編代碼。
比如對(duì)于test.cpp,可以使用如下的命令得到匯編指令:
通過(guò)這樣的方式能看到可執(zhí)行文件所對(duì)應(yīng)的匯編指令。
3. 使用gdb命令得到匯編代碼
第1、2兩種情況下得到的都是編譯期間生成的匯編指令,但因?yàn)橛行┐a是運(yùn)行時(shí)才能確定的原因,所以運(yùn)行時(shí)的匯編指令與編譯時(shí)并不完全一致,比如棧的地址,編譯期間其實(shí)是不知道的,運(yùn)行時(shí)才會(huì)真正的分配。
我們可以使用gdb來(lái)獲取每一行代碼運(yùn)行時(shí)所對(duì)應(yīng)的匯編指令,首先使用g++ -g test.cpp -o test來(lái)得到可執(zhí)行文件,然后gdb ./test進(jìn)入gdb模式,比如對(duì)于這段c++代碼:
使用如下gdb命令可得到對(duì)應(yīng)的匯編指令:
這樣看起問(wèn)題來(lái)就很方便了,我們能看到每一行c++代碼對(duì)應(yīng)的匯編指令是什么,對(duì)于初學(xué)者而言,使用此種方式是最為方便的。
好了,本篇文章就為大家介紹到這里,覺(jué)得內(nèi)容對(duì)你有用的話,記得支持一下喲!
如果你也喜歡編程,想好C/C++的話!如果你也想讓自己成為一個(gè)具有真材實(shí)料的厲害的程序員,不妨從現(xiàn)在開(kāi)始!
微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地
整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!

【經(jīng)驗(yàn)分享】如何查看C++生成的匯編代碼?的評(píng)論 (共 條)
