4

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

此外,如果有办法,与仅手动翻译相比,输出汇编文件源代码有多好(如:优雅)?

4

5 回答 5

10

大多数编译器都会让您生成汇编输出。举几个明显的例子,Clang 和 gcc/g++ 使用了这个-S标志,而 MS VC++ 使用了这个-Fa标志。

一些编译器不直接支持这一点(例如,如果内存服务于 Watcom 没有)。我所见过的那些让你生成一个目标文件,然后包含一个反汇编程序,它可以从目标文件生成一个汇编语言文件。我不记得了,但如果这是你需要用 Digital Mars 编译器做的事情,我不会感到惊讶。

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

于 2013-11-13T17:56:57.477 回答
6

看看gcc -S

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

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

于 2013-11-13T17:57:12.993 回答
2

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

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

于 2013-11-13T17:55:47.387 回答
2

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

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

于 2013-11-13T18:26:12.343 回答
0
(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 例程。这是很多很多额外的工作。

于 2013-11-13T18:43:00.017 回答