2015-05-04 192 views
8

当我调试一个C项目时,我可以看到它编译到的所有汇编代码。我想知道它是什么汇编语言。它是NASM还是MASM还是别的?如果我使用内联汇编,我是否可以使用其他汇编语言?C代码在Visual Studio中编译成什么汇编语言?

+3

VS将C和C++直接编译为机器码,而不是程序集。你可能会得到一个汇编语言列表,但我不知道那些命令(在gcc中,你可以使用-S选项)。 –

+0

@JohnBode为什么gcc不能直接编译成机器码? –

+0

通常它会;您必须使用命令行选项才能执行其他操作。 –

回答

6

它编译的代码不是程序集,而是直接的机器代码,至少在链接时优化之后。您在调试时看到的是正在执行的机器代码的即时反汇编。因此,它没有额外的结构,比如标签,宏等,这样您就可以在高级汇编程序中找到它们,因为这些额外的信息在生成机器码时丢失了(或者更确切地说,从不存在) 。

如果您的意思是语法,Visual Studio会在Intel syntax中显示汇编指令,这与ATT语法不同,这是GCC和GNU汇编程序的默认语法。

事实上,它也可能是胡言乱语。如果你不对齐(x86指令是可变长度的),或者不包含可执行代码而是数据的区域,反汇编器将试图理解数据,产生不意味着随机汇编指令,这并不意味着任何东西。

这实际上很常见;参见例如此图像:

enter image description here

add byte ptr [rax], al是字节00 00,这显然并不代表实际的可执行代码的企图拆卸。

2

MSVC可以编译x86,x86_64,ARM和Itanium的二进制文件。所以这取决于你的目标和项目设置

2

对于X86或X86-X64,Visual Studio包括32位代码的ML.EXE(MASM 6.00和更高版本被重命名为ML.EXE)和64位的ML64.EXE码。在VS项目中,您可以右键单击文件名,然后属性,...输出文件,...程序集列表...。汇编列表的命令行选项是/ Fa。尽管只调用了汇编代码清单,但它生成汇编代码。