c - C代码在Visual Studio中编译成什么汇编语言?

标签 c visual-studio assembly

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

最佳答案

它编译成的代码不是汇编代码,而是直接的机器代码,至少在链接时优化之后是这样。您在调试时看到的是当前正在执行的机器代码的即时反汇编。因此,它没有额外的结构,例如标签、宏等,您希望在高级汇编程序中找到这些结构,因为在生成机器代码时,这些额外信息会丢失(或者更准确地说,永远不会出现) .

如果您指的是语法,Visual Studio 会在 Intel syntax 中显示程序集指令,这与 AT&T 语法不同,后者是 GCC 和 GNU 汇编程序的默认语法。

其实也有可能是乱码。如果您 jmp 不对齐(x86 指令是可变长度的),或者到一个不包含可执行代码但包含数据的区域,反汇编器将尝试理解数据,产生随机没有任何意义的汇编指令。

这实际上很常见;例如看这张图片:

enter image description here

add byte ptr [rax], al是对字节00 00的尝试反汇编,显然不代表实际的可执行代码。

关于c - C代码在Visual Studio中编译成什么汇编语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30028855/

相关文章:

在 if 语句或 switch 中调用函数无法正常工作

visual-studio - 在多条语句的行中间设置断点

.net - 在 Mono 中获取 .NET 应用程序的已编译 asm

c - 有效地找到大数组中的最低有效位?

CS50 潮人 - :( lock_pairs skips final pair if it creates cycle

java - 如何在 JNA 中传递包含原始类型数组的结构?

c - 尝试使用 execle 时预期参数声明符错误

c# - 当前的 .NET SDK 不支持面向 .NET Core 2.2。 (SDK 2.2.202)

visual-studio - visual studio中windows平台自动格式化特征文件的快捷键是什么?

assembly - 如何在 x86 上使用 AT&T 语法将立即字节添加到长寄存器?