目标代码、机器代码和汇编代码之间的区别是什么?
你能给出一个直观的例子来说明它们的区别吗?
发布于 2009-01-21 20:22:51
机器码是可以直接由CPU执行的二进制(1和0)代码。如果您在文本编辑器中打开机器代码文件,您将看到垃圾,包括不可打印的字符(不,不是那些不可打印的字符;)。
目标代码是尚未链接到完整程序中的机器代码的一部分。它是一个特定库或模块的机器代码,它将构成完整的产品。它还可能包含在完整程序的机器代码中找不到的占位符或偏移量。链接器将使用这些占位符和偏移量将所有内容连接在一起。
汇编代码是纯文本的,并且(在某种程度上)人类可读的源代码,它主要与机器指令直接1:1类似。这是使用实际指令、寄存器或其他资源的助记符来实现的。例如,用于中央处理器跳转和乘法指令的JMP和MULT。与机器代码不同,CPU不理解汇编代码。您可以使用汇编程序或编译器将汇编代码转换为机器码,尽管我们通常认为编译器与高级编程语言相关联,这些高级编程语言是从CPU指令中进一步抽象出来的。
构建一个完整的程序涉及到用汇编语言或更高级的语言(如C++ )为程序编写源代码。源代码被汇编(对于汇编代码)或编译(对于高级语言)为目标代码,并且各个模块被链接在一起,成为最终程序的机器代码。在非常简单的程序的情况下,可能不需要链接步骤。在其他情况下,例如使用IDE (集成开发环境),可以一起调用链接器和编译器。在其他情况下,可以使用复杂的make脚本或解决方案文件来告诉环境如何构建最终的应用程序。
还有一些行为不同的解释语言。解释型语言依赖于特殊解释器程序的机器代码。在基本级别,解释器解析源代码,并立即将命令转换为新的机器码并执行它们。现代解释器现在要复杂得多:一次评估整个源代码部分,在可能的情况下缓存和优化,以及处理复杂的内存管理任务。
最后一种类型的程序涉及使用runtime-environment或虚拟机。在这种情况下,首先将程序预编译成较低级的中间语言或字节码。然后,该字节码由虚拟机加载,它会及时将其编译为本机代码。这里的优点是虚拟机可以利用程序运行时和特定环境下可用的优化。编译器属于开发人员,因此必须生成相对通用(优化程度较低)的机器码,这些机器码可以在许多地方运行。但是,运行时环境或虚拟机位于最终用户的计算机上,因此可以利用该系统提供的所有功能。
发布于 2009-07-31 15:31:14
其他答案很好地描述了不同之处,但您也要求视觉效果。下面的图表显示了它们从C代码到可执行文件的过程。

发布于 2009-01-21 20:23:05
汇编代码是机器代码的人类可读表示:
mov eax, 77
jmp anywhere机器代码是纯十六进制代码:
5F 3A E3 F1我假设你指的是目标文件中的目标代码。这是机器码的一种变体,不同之处在于跳转是某种参数化的,以便链接器可以填充它们。
汇编程序用于将汇编代码转换为机器代码(目标代码)。链接器链接多个对象(和库)文件以生成可执行文件。
我曾经用纯十六进制(没有可用的汇编器)写过一个汇编程序,幸运的是,这是在好的旧的(古老的) 6502上。但我很高兴有奔腾操作码的汇编程序。
https://stackoverflow.com/questions/466790
复制相似问题