回答
使用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. 获得从汇编代码
- 3. gcc汇编输出
- 4. 从源代码编译gcc时出错
- 5. 使用gcc编译C文件以获得x86汇编代码
- 6. 如何使用GCC将汇编代码前缀到程序上?
- 7. 获得从联汇编代码
- 8. 无法获得以下MIPS汇编代码的输出
- 9. 如何编写输出源代码的程序
- 10. 转换GCC汇编代码为armasm汇编代码
- 11. 如何从程序获得std输出
- 12. 我的汇编程序似乎没有输出32位代码
- 13. 使用avr-gcc编写汇编代码
- 14. 在哪里可以找到GCC程序集输出中调用的程序的汇编代码?
- 15. 链接汇编到GCC的NASM代码
- 16. 如何获得gcc 4.5(从源代码编译)在Mac OS X上使用Objective C | C++程序?
- 17. 是否有反汇编程序生成可编译的汇编源代码?
- 18. 从源代码编译gcc(问题)
- 19. 如何从同行获得源代码
- 20. x86 gcc汇编输出帮助请
- 21. 学习阅读GCC汇编输出
- 22. GCC C++和内联汇编代码?
- 23. 一个strcpy gcc内联汇编代码
- 24. C程序中的汇编代码(用masm编写)(用gcc编译)......怎么样?
- 25. 关于gcc生成的汇编代码(汇编代码不正确?)
- 26. 如何使用GCC将C代码编译为8088汇编?
- 27. 如何从PHP生成的输出中获得漂亮的HTML源代码?
- 28. 使用avr-gcc编译汇编程序
- 29. 如何从VS2005中的C文件中获取汇编程序输出
- 30. GCC汇编内联:与只有内联汇编代码
有关**使asm输出可读**的提示,另请参阅:[如何从GCC/clang程序集输出中删除“noise”](http://stackoverflow.com/questions/38552116/how-从gcc-clang-assembly-output中删除噪音) – 2016-07-26 04:30:06