是否有可能以某种方式转换简单的C或C ++代码(通过简单的意思是:将一些int作为输入,打印一些依赖于int作为输出的简单形状)到汇编语言?如果没有,我会手动完成,但因为我要为Intel 8080这样的处理器做这件事,所以看起来有点单调乏味。你能以某种方式自动化这个过程吗?
另外,如果有一种方法,那么输出汇编文件源代码与仅手动翻译相比有多好(如:优雅)?
答案 0 :(得分:9)
大多数编译器都会让你产生汇编输出。对于一些明显的例子,Clang和gcc / g ++使用-S
标志,MS VC ++使用-Fa
标志来执行此操作。
一些编译器不直接支持这一点(例如,如果内存供应Watcom没有)。我看到过这样的文件,你生成了一个目标文件,然后包含一个反汇编程序,它将从目标文件中生成一个汇编语言文件。我不记得了,但如果您需要使用Digital Mars编译器,我不会感到惊讶。
对于习惯于编写汇编语言的人来说,大多数编译器的输出通常往往看起来有点不优雅,尤其是像x86这样的CPU,它有很多寄存器,现在真的是通用的,但历史上有更具体的含义。例如,如果某段代码需要指针和计数器,那么一个人可能会将指针放在ESI或EDI中,而计数器放在ECX中。编译器可能很容易逆转这些。那个工作很好,但是一位经验丰富的汇编语言程序员无疑会发现使用ESI作为指针和ECX作为计数器更具可读性。
答案 1 :(得分:5)
看看gcc -S
:
gcc -S hello.c # outputs hello.s file
维持至少部分gcc兼容性的其他编译器也可以接受此标志。例如,LLVM的clang
会这样做。
答案 2 :(得分:2)
这里的大多数人都是对的,但似乎错过了关于8080的音符(难怪,它不在标题中:)。然而,谷歌一如既往地拯救 - 寻找compiler for 8080
产生了一些不错的结果:
其中大多数都很旧,可能维护得很差。您也可以尝试相当类似的8085
答案 3 :(得分:1)
嗯,是的,有这样一个程序。它被称为“编译器”
回答您的编辑:输出的优雅取决于编译器的优化。通常编译器不生成我们人们称之为“优雅”的代码。
答案 4 :(得分: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例程。这是很多额外的工作。