c++ - C++ 编译器使用什么类型的程序集?

标签 c++ assembly

据我所知,c++ 代码由汇编代码组成,当我编译一个程序时,它被读取为等效的汇编代码,然后由编译器运行。我还了解到,程序集语法和功能因处理器模型而异。如果是这样,编译器如何设法编译程序而不被 bug 所困扰?我的意思是,编译器不可能保存每个创建的汇编语言变体,对吗?

最佳答案

我认为您混淆了汇编代码和机器代码。这是不一样的。机器代码是 CPU 执行的——指令和数据的字节流。汇编是机器代码的人类可读表示。

的确,所有 C++ 代码最终都会编译成机器码。是的,CPU 和 CPU 版本之间的指令集会发生变化。编译器有“目标架构”的概念——当你编译时,你可以选择指定一个。如果不这样做,通常会假定当前机器的体系结构。是的,编译器供应商必须努力支持他们打算支持的每一种 CPU。幸运的是,没有那么多。此外,在 C 编译过程中,代码生成甚至不是最复杂的步骤,因此大多数编译器自身的代码都不是 CPU 特定的。

一些编译器通过汇编工作——而不是生成机器代码,它们生成汇编并将其提供给汇编器以进行最后的编译阶段。通过这种设计,您的编译器通常会假定系统中存在某种汇编程序风格 - 通常是 GNU 汇编程序(as)。

关于c++ - C++ 编译器使用什么类型的程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24918634/

相关文章:

assembly - ASM : lock cmpxchg dest, src 中存在非法指令

android - 连接到数据库,多个平台的可能选项

c++ - 编译器用析构函数定义移动构造函数

c++ - 获取 iostream 的 fatal error

c++ - 为驱动程序定义 GUID 的推荐方法是什么?

c - 缓冲区溢出跳转到禁用的功能

c++ - OpenGL:仅使用 GL_POINTS 渲染一条线

c - 内存间接寻址 movl - 汇编

c - 跳过模拟器中的指令

linux - 如何在 ubuntu 下使用 nasm(程序集)从键盘读取单个字符输入?