目标代码、机器代码和汇编代码之间有什么区别?
你能举例说明它们的不同吗?
程序集代码讨论在这里。
汇编语言是一种用于计算机编程的低级语言。它实现了数字机器代码和编程特定CPU架构所需的其他常量的符号表示。”
机器代码讨论在这里。
机器代码或机器语言是由计算机中央处理单元直接执行的指令和数据系统。
基本上,汇编代码是一种语言,它由汇编程序(类似于编译器)翻译成目标代码(CPU运行的本机代码)。
机器代码是二进制(1和0)代码,可以直接由CPU执行。如果你在文本编辑器中打开一个机器代码文件,你会看到垃圾,包括不可打印字符(不,不是那些不可打印字符;))。
目标代码是尚未链接到完整程序的机器代码的一部分。它是组成完整产品的特定库或模块的机器代码。它还可能包含在已完成程序的机器代码中没有的占位符或偏移量。链接器将使用这些占位符和偏移量将所有内容连接在一起。
汇编代码是纯文本和(有点)人类可读的源代码,主要与机器指令有直接1:1的模拟。这是通过使用实际指令、寄存器或其他资源的助记符来实现的。例如CPU的跳转和乘法指令的JMP和MULT。与机器代码不同,CPU不理解汇编代码。你可以使用汇编程序或编译器将汇编代码转换为机器代码,尽管我们通常认为编译器与高级编程语言有关,这些语言从CPU指令中进一步抽象出来。
JMP
MULT
构建一个完整的程序包括用汇编语言或c++等高级语言为程序编写源代码。源代码被组装(对于汇编代码)或编译(对于高级语言)为目标代码,各个模块被链接在一起,成为最终程序的机器码。对于非常简单的程序,可能不需要链接步骤。在其他情况下,例如在IDE(集成开发环境)中,链接器和编译器可以一起调用。在其他情况下,可能会使用复杂的使脚本或解决方案文件来告诉环境如何构建最终的应用程序。
还有行为不同的解释型语言。解释型语言依赖于特殊解释器程序的机器码。在基本级别上,解释器解析源代码,并立即将命令转换为新的机器代码并执行它们。现代解释器现在要复杂得多:一次计算源代码的整个部分,在可能的地方缓存和优化,以及处理复杂的内存管理任务。
最后一种程序类型涉及到运行时环境或虚拟机的使用。在这种情况下,程序首先被预编译为较低级的中间语言或字节码。字节代码然后由虚拟机加载,虚拟机及时将其编译为本机代码。这里的优点是虚拟机可以在程序运行时利用针对特定环境的可用优化。编译器属于开发人员,因此必须生成可以在许多地方运行的相对通用的(较少优化的)机器代码。然而,运行时环境或虚拟机位于最终用户的计算机上,因此可以利用该系统提供的所有功能。
汇编代码是人类可读的机器代码表示:
mov eax, 77 jmp anywhere
机器代码是纯十六进制代码:
5F 3A E3 F1
我猜你指的是目标文件中的目标代码。这是一种机器代码的变体,不同之处在于跳转是参数化的,这样链接器就可以填充它们。
我曾经用纯十六进制写过一个汇编程序(没有汇编程序可用),幸运的是,这是在古老的6502上写的。但我很高兴有奔腾操作码的汇编器。
8B 5D 32是机器代码
8B 5D 32
mov ebx, [ebp+32h]是汇编
mov ebx, [ebp+32h]
包含8B 5D 32的lmylib.so是目标代码
lmylib.so
我认为这些是主要的区别
可读性可以使代码在创建6个月后得到改进或替换,另一方面,如果性能至关重要,您可能希望使用低级语言来针对生产中的特定硬件,从而获得更快的执行速度。
在我看来,今天的计算机已经足够快,可以让程序员通过OOP快速执行。
汇编是人类可以理解的简短的描述性术语,可以直接转换为CPU实际使用的机器代码。
虽然汇编程序在某种程度上为人类所理解,但它仍然是低水平的。做任何有用的事情都需要大量的代码。
所以我们使用高级语言,如C, BASIC, FORTAN(好吧,我知道我和自己约会过)。当编译这些代码时,会生成目标代码。早期语言以机器语言作为目标代码。
现在的许多语言,如JAVA和c#,通常编译成字节码,这些字节码不是机器代码,而是在运行时容易解释以产生机器代码的字节码。
其他答案很好地描述了差异,但你也要求视觉。下面的图表显示了它们从C代码到可执行文件的过程。
< img src = " https://i.stack.imgur.com/kKTfY.png " >
还有一点没有提到,那就是有几种不同类型的汇编代码。在最基本的形式中,指令中使用的所有数字都必须指定为常量。例如:
$1902: BD 37 14 : LDA $1437,X $1905: 85 03 : STA $03 $1907: 85 09 : STA $09 $1909: CA : DEX $190A: 10 : BPL $1902
上面这段代码,如果存储在Atari 2600卡带的地址$1900处,将显示从地址$1437开始的表中获取的不同颜色的行数。在一些工具上,输入一个地址,以及上面一行的最右边部分,会将中间一列中显示的值存储到内存中,并以下面的地址开始下一行。以这种形式输入代码比输入十六进制要方便得多,但必须知道所有东西的精确地址。
大多数汇编程序允许使用符号地址。上面的代码应该是这样写的:
rainbow_lp: lda ColorTbl,x sta WSYNC sta COLUBK dex bpl rainbow_lp
汇编程序将自动调整LDA指令,以便它引用映射到标签ColorTbl的任何地址。使用这种类型的汇编器,编写和编辑代码要比手工输入和维护所有地址容易得多。
源代码,汇编代码,机器代码,对象代码,字节代码,可执行文件和库文件。
对于大多数人来说,所有这些术语都非常令人困惑,因为他们认为他们是相互排斥的。请参见图表了解它们之间的关系。下面给出了每个术语的描述。
.
人类可读(编程)语言的指令
用高级编程语言编写的指令 。, C, c++和Java程序
用汇编语言(一种低级编程语言)编写的指令。 作为编译过程的第一步,高级代码转换为这种形式。它是汇编代码,然后被转换成实际的机器代码。在大多数系统上,这两个步骤作为编译过程的一部分自动执行。 。, program.asm < / p >
编译过程的产物。它可以是机器代码或字节代码的形式。 。, file.o < / p >
机器语言指令。 。, a.o ut < / p >
中间形式的指令,可由解释器(如JVM)执行。 。, Java类文件
连接过程的乘积。它们是可以被CPU直接执行的机器码。 。
注意,在某些情况下,包含字节码或脚本语言指令的文件也可能被认为是可执行的。
有些代码出于不同的原因被编译成这种形式,比如可重用性,然后被可执行文件使用。
程序的源文件被编译成目标文件,然后链接器将这些目标文件链接在一起,生成一个包含您的体系结构的机器代码的可执行文件。
当目标文件和可执行文件被文本编辑器打开时,都以可打印和不可打印字符的形式涉及到体系结构的机器代码。
尽管如此,文件之间的二分法是,目标文件可能包含未解析的外部引用(例如printf)。因此,它可能需要链接到其他对象文件。也就是说,需要解析未解析的外部引用,以便通过与其他目标文件(如C/ c++运行时库)的链接来获得良好的可运行的可执行文件。
printf