是否可以转换C/C++;程序集的源代码? 是否可以将简单的C或C++代码(简单的意思是:把一些int作为输入,将一些依赖于int的简单形状作为输出)转换成汇编语言?如果没有的话,我会手动操作,但因为我要为英特尔8080这样的处理器操作,所以看起来有点乏味。你能自动完成这个过程吗

是否可以转换C/C++;程序集的源代码? 是否可以将简单的C或C++代码(简单的意思是:把一些int作为输入,将一些依赖于int的简单形状作为输出)转换成汇编语言?如果没有的话,我会手动操作,但因为我要为英特尔8080这样的处理器操作,所以看起来有点乏味。你能自动完成这个过程吗,c++,c,assembly,C++,C,Assembly,另外,如果有办法的话,输出汇编文件源代码与手动翻译相比有多好(如:优雅)?是的,有这样一个程序。它叫“编译器” 回答您的编辑:输出的优雅取决于编译器的优化。通常编译器不会生成我们称之为“优雅”的代码。大多数编译器会让您生成程序集输出。对于几个明显的例子,Clang和gcc/g++使用-S标志,MS VC++使用-Fa标志来实现这一点 一些编译器不直接支持这一点(例如,如果Watcom没有提供内存服务)。我所看到的是这样的,您生成了一个对象文件,然后包含了一个反汇编程序,可以从对象文件生成汇编语言

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

是的,有这样一个程序。它叫“编译器”


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

大多数编译器会让您生成程序集输出。对于几个明显的例子,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的注释(难怪,它不在标题中:)。然而,谷歌一如既往地出手相救——寻找8080的
compiler
会产生如下一些不错的结果:

其中大多数都很旧,可能维护得很差。您也可以尝试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例程。这需要做很多额外的工作。

有一些程序可以做到这一点。。。它们被称为编译器;-)。例如,试一下
gcc-S
。将一种语言翻译成另一种语言的过程称为编译,我们通常将C/C++编译成二进制,但编译成另一种语言,无论是汇编语言还是java语言,也是很有可能的,大多数C/C++工具链允许您直接编译成汇编语言。然而,在gcc和Clang中,这是使用-S标志完成的。一般来说,我们主要进行减少抽象的编译,从低级语言编译到高级语言,有时在从低级语言编译到创建低级翻译的语言时,被称为“反编译”。但是,这通常意味着丢失所有或大部分抽象,因为在从高级到低级的编译过程中,这些抽象通常会丢失。最后一点,当从高级语言编译到低级语言时,禁用调试符号和优化可能是一个好主意,为了使输出程序集更适合人类读者。请注意,使用gcc时,程序集输出是AT&T风格的。我认为,有一个英特尔语法的开关。
-masm
开关选择asm风格,似乎我没有使用过它。此外,我不确定gcc是否会生成将在8080上运行的代码!你可能是对的。。。您可以将特定的CPU设置为
-march
标志,但您可以设置的最早的acieve可能是
i386
。非常感谢。关于你提到的寄存器,我有一个问题:正如我所说,我需要一个汇编代码,使它能够在英特尔8080或类似的“古老”处理器下工作。有没有办法模拟(或以某种方式“告诉”)编译器它编译的是什么类型的CPU,这样我就得到了一个汇编代码,它不使用8080或8086中根本不存在的寄存器?@Straightfw:从实用的角度看,你所能做的(可能)就是找到一个以8086为目标的旧编译器。大多数编译器分为前端(专用于源语言)和后端(专用于目标处理器),因此(理论上)您可以编写一个针对所讨论的处理器的后端,但这通常并不简单。对于一个非常有限的处理器来说,这确实是相当困难的。@Straightfw:这不仅仅是缺少几个寄存器。实际上,所有32位和64位寄存器都缺少80386之前的寄存器。而且
long
仍然是32位类型。这意味着您的编译器必须能够做一些现代编译器不关心的事情,只使用16位寄存器合成32位操作。在运行时效率方面,它将是优雅的,但人类不容易阅读:)非常感谢您解决了我问题中的一个小但非常重要的细节:)