回答
使用gcc(或g ++)的-S
選項。
gcc -S helloworld.c
這將運行在helloworld.c預處理器(CPP),執行初始編譯,然後運行彙編器之前停止。
默認情況下,這將輸出文件helloworld.s
。輸出文件仍可通過使用-o
選項進行設置。
gcc -S -o my_asm_output.s helloworld.c
當然,這隻有在您有原始來源時纔有效。 如果只有生成的目標文件,則通過設置--disassemble
選項(或-d
的縮寫形式),使用objdump
。
objdump -S --disassemble helloworld > helloworld.dump
如果調試選項是目標文件(-g
在編譯時)啓用,該文件並沒有被剝奪,此選項效果最佳。
運行file helloworld
會給你一些關於你將通過使用objdump獲得的詳細程度的指示。
雖然這是正確的,但我發現Cr McDonough的答案更有用。 – 2013-11-03 02:13:02
另外一個用途:objdump -M intel -S --disassemble helloworld> helloworld.dump以intel語法獲得對象轉儲,與linux上的nasm兼容。 – touchStone 2015-03-11 11:58:33
使用-s選項:
gcc -S program.c
如果你想看取決於輸出的鏈接,那麼除了前面提到的gcc -S之外,輸出對象文件/可執行文件上的objdump也可能是有用的。這裏是由羅蘭梅里特一個非常有用的腳本,默認objdump的語法轉換成更具可讀性NASM語法:
#!/usr/bin/perl -w
$ptr='(BYTE|WORD|DWORD|QWORD|XMMWORD) PTR ';
$reg='(?:[er]?(?:[abcd]x|[sd]i|[sb]p)|[abcd][hl]|r1?[0-589][dwb]?|mm[0-7]|xmm1?[0-9])';
open FH, '-|', '/usr/bin/objdump', '-w', '-M', 'intel', @ARGV or die;
$prev = "";
while(<FH>){
if(/$ptr/o) {
s/$ptr(\[[^\[\]]+\],$reg)/$2/o or
s/($reg,)$ptr(\[[^\[\]]+\])/$1$3/o or
s/$ptr/lc $1/oe;
}
if($prev =~ /\t(repz)?ret/and
$_ =~ /\tnop |\txchg *ax,ax$/) {
# drop this line
} else {
print $prev;
$prev = $_;
}
}
print $prev;
close FH;
我懷疑這也可以在GCC-S的輸出使用。
不過,這個腳本是一個骯髒的黑客,它不完全轉換語法。例如。 `mov eax,ds:0x804b794`不是很NASMish。另外,它有時只是去除有用的信息:`movzx eax,[edx + 0x1]`讓讀者猜測內存操作數是'byte'還是'word'。 – Ruslan 2017-10-07 22:00:01
要首先在NASM語法中進行反彙編,請使用[Agner Fog's`objconv`](http://agner.org/optimize/#objconv)。你可以通過輸出file =`/ dev/stdout`將它反彙編到標準輸出中,這樣你就可以輸入`less`來查看。還有`ndisasm`,但它只是分解平面二進制文件,並不知道目標文件(ELF/PE)。 – 2017-10-07 22:12:51
大家都指出,使用GCC的-S
選項。我還想補充一點,根據是否添加優化選項(none爲-O0
,積極優化爲-O2
),結果可能會有所不同(瘋狂!)。
特別是在RISC體系結構中,編譯器經常會在進行優化時將代碼轉換成幾乎無法識別的地方。看看結果令人印象深刻,令人着迷!
這將生成帶有C代碼+行號交織的asm,從而更容易地看到哪些行會生成哪些代碼。
# create assembler code:
c++ -S -fverbose-asm -g -O2 test.cc -o test.s
# create asm interlaced with source lines:
as -alhnd test.s > test.lst
在Algorithms for programmers發現,第4頁。
正如前面提到的,看看-S標誌。
也值得一看'-fdump-tree'系列的標誌,尤其是'-fdump-tree-all',它可以讓你看到一些gcc的中間形式。這些通常比彙編更具可讀性(至少對我來說),並讓您看到優化傳遞是如何執行的。
使用「-S」作爲選項。它顯示終端中的組件輸出。
來源:http://www.delorie.com/djgpp/v2faq/faq8_20.html
的gcc -c -g -Wa,-a,-ad [其他海灣合作委員會選項]的foo.c> foo.lst
在替代PhirePhly的回答 或者只是使用 - 像大家所說的那樣。
如果您正在尋找LLVM彙編:
llvm-gcc -emit-llvm -S hello.c
好了,大家都表示,使用-s選項。 如果使用-save-temps選項,還可以獲取預處理文件(.i),程序集文件(。)和目標文件(* .o)。 (通過使用-E,-S和-C得到它們。)
下面的命令行是從Christian Garbin's blog
g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt
我跑G ++從在Win-XP DOS窗口,針對包含隱式轉換
c:\gpp_code>g++ -g -O -Wa,-aslh horton_ex2_05.cpp >list.txt
horton_ex2_05.cpp: In function `int main()':
horton_ex2_05.cpp:92: warning: assignment to `int' from `double'
輸出asssembled生成的代碼iterspersed與原來的C++代碼例程(C++代碼被示爲所產生的ASM流中評論)
16:horton_ex2_05.cpp **** using std::setw;
17:horton_ex2_05.cpp ****
18:horton_ex2_05.cpp **** void disp_Time_Line (void);
19:horton_ex2_05.cpp ****
20:horton_ex2_05.cpp **** int main(void)
21:horton_ex2_05.cpp **** {
164 %ebp
165 subl $128,%esp
?GAS LISTING C:\DOCUME~1\CRAIGM~1\LOCALS~1\Temp\ccx52rCc.s
166 0128 55 call ___main
167 0129 89E5 .stabn 68,0,21,LM2-_main
168 012b 81EC8000 LM2:
168 0000
169 0131 E8000000 LBB2:
169 00
170 .stabn 68,0,25,LM3-_main
171 LM3:
172 movl $0,-16(%ebp)
我沒有看到答案之間的這種可能性,可能是因爲這個問題是從2008年,但在2018年,您可以使用馬特Goldbolt的在線網站https://godbolt.org
您也可以在本地的Git克隆和運行自己的項目https://github.com/mattgodbolt/compiler-explorer
下面是看/打印任何C程序的彙編代碼上的Windows
控制檯/終端/命令提示的步驟:
寫類似的代碼塊一個C代碼編輯器,一個C程序,並用一種推廣保存它的.c
編譯並運行它。
一旦成功運行,進入文件夾,您安裝GCC編譯器和給
下面的命令來獲得「.C」文件
℃的「.S」文件: \ GCC> GCC -S C文件的完整路徑ENTER
一個實例命令(如在我的情況)
C:\ GCC> GCC -SD:\ Aa_C_Certified \ alternate_letters.c
此輸出原始 '.C' 的 '.S' 文件文件
4。在此之後,輸入以下命令
℃; \ GCC> CPP filename.s ENTER
示例命令(如在我的情況)
℃; \ GCC> CPP alternate_letters.s
這將打印/輸出C程序的整個彙編語言代碼。
- 1. 如何在gcc中獲得完整的彙編程序輸出?
- 2. gcc彙編輸出
- 3. 獲得從聯彙編代碼
- 4. 如何編寫輸出源代碼的程序
- 5. 我的彙編程序似乎沒有輸出32位代碼
- 6. 在哪裏可以找到GCC程序集輸出中調用的程序的彙編代碼?
- 7. 鏈接彙編到GCC的NASM代碼
- 8. 如何獲得gcc 4.5(從源代碼編譯)在Mac OS X上使用Objective C | C++程序?
- 9. 是否有反彙編程序生成可編譯的彙編源代碼?
- 10. x86 gcc彙編輸出幫助請
- 11. 學習閱讀GCC彙編輸出
- 12. GCC C++和內聯彙編代碼?
- 13. 如何使用GCC將C代碼編譯爲8088彙編?
- 14. 如何從PHP生成的輸出中獲得漂亮的HTML源代碼?
- 15. 使用avr-gcc編譯彙編程序
- 16. 如何從VS2005中的C文件中獲取彙編程序輸出
- 17. GCC彙編內聯:與只有內聯彙編代碼
- 18. 如何獲得G ++彙編代碼指令的地址
- 19. Tokenizing SIC彙編程序源碼
- 20. C程序的彙編代碼
- 21. 如何運行我從Android源代碼獲取的應用程序源代碼?
- 22. 如何從Scrapy獲得UTF-8編碼的unicode輸出?
- 23. 編譯Linux內核時,CC,LD和CC [M]輸出的代碼是什麼?
- 24. 如何編譯高級代碼以獲取彙編代碼?
- 25. 如何從GCC源代碼構建本地編譯器?
- 26. 我的第一個彙編程序錯誤(GCC內聯彙編)
- 27. GCC的一個空的程序的彙編輸出在x86,Win32的
- 28. 彙編程序和C++輸出文本
- 29. GCC進行每次優化後獲取彙編代碼?
- 30. 從gcc獲取彙編代碼的問題 - 盡了我最大的努力
有關**使asm輸出可讀**的提示,另請參閱:[如何從GCC/clang程序集輸出中刪除「noise」](http://stackoverflow.com/questions/38552116/how-從gcc-clang-assembly-output中刪除噪音) – 2016-07-26 04:30:06