是否可以将C / C++源代码转换为汇编

Is it possible to convert C/C++ source code to assembly?

本文关键字:源代码 转换 汇编 C++ 是否      更新时间:2023-10-16
是否有

可能以某种方式将简单的 C 或 C++ 代码(我的意思是:将一些 int 作为输入,打印一些依赖于该 int 作为输出的简单形状)转换为汇编语言?如果没有,我只会手动完成,但由于我将为英特尔 8080 等处理器执行此操作,这似乎有点乏味。你能以某种方式自动化这个过程吗?

另外,如果有一种方法,与仅手动翻译相比,输出程序集文件源代码会有多好(如:优雅)?

大多数编译器都允许您生成程序集输出。对于几个明显的例子,Clang和gcc/g++使用-S标志,MS VC++使用-Fa标志来执行此操作。

一些编译器不直接支持此功能(例如,如果内存服务,Watcom 没有)。我见过这样的那些让你生成一个对象文件,然后包含一个反汇编器,它将从目标文件生成汇编语言文件。我不确定,但如果这是你需要用数字火星编译器做的事情,我不会感到惊讶。

对于习惯于编写汇编语言的人来说,大多数编译器的输出通常看起来至少有些不优雅,尤其是在像 x86 这样的 CPU 上,它有相当多的寄存器,这些寄存器现在真的是通用的,但历史上有更具体的含义。例如,如果一段代码同时需要指针和计数器,那么一个人可能会将指针放在 ESI 或 EDI 中,将计数器放在 ECX 中。编译器可能很容易反转这些。这将正常工作,但是经验丰富的汇编语言程序员无疑会发现使用ESI作为指针和ECX作为计数器更具可读性。

看看gcc -S

gcc -S hello.c # outputs hello.s file

其他保持部分 gcc 兼容性的编译器也可以接受此标志。例如,LLVM的clang就是这样。

,是的,有这样一个程序。它被称为"编译器"

要回答您的编辑:输出的优雅程度取决于编译器的优化。通常编译器不会生成我们人类称之为"优雅"的代码。

这里的大多数人都是对的,但似乎错过了关于 8080 的注释(难怪,它不在标题:)中。然而,谷歌一如既往地来拯救 - 寻找compiler for 8080产生了一些不错的结果,如下所示:

  • http://www.bdsoft.com/resources/bdsc.html
  • http://tack.sourceforge.net/

其中大多数都很旧,可能维护不善。您也可以尝试8085,它非常相似

(by simple I mean: taking some int as input, printing some simple shapes dependent on 
 that int as output) to assembly language?

查看 x86 编译器的输出不会很有帮助,因为输入和输出是由 C 或 C++ 库完成的。对于 8080,没有这样的库,因此您必须为某些特定硬件开发自己的 I/O 例程。这是很多很多额外的工作。