汇编代码与机器代码对象代码?

时间:2009-01-21 20:17:27

标签: assembly machine-code object-code

目标代码,机器代码和汇编代码之间有什么区别?

你能举例说明他们之间的区别吗?

10 个答案:

答案 0 :(得分:263)

机器代码是二进制(1和0)代码,可由CPU直接执行。如果您要在文本编辑器中打开机器代码文件,您会看到垃圾,包括不可打印的字符(不,不是那些不可打印的字符;)。)

对象代码是尚未链接到完整程序的机器代码的一部分。它是构成完成产品的特定库或模块的机器代码。它还可能包含在已完成程序的机器代码中找不到的占位符或偏移量。 链接器将使用这些占位符和偏移量将所有内容连接在一起。

汇编代码是纯文本和(有些)人类可读源代码,大多数情况下都是直接1:1模拟机器指令。这是使用助记符来实现实际指令,寄存器或其他资源。示例包括JMPMULT,用于CPU的跳转和乘法指令。与机器代码不同,CPU不了解汇编代码。您可以使用汇编程序编译器将汇编代码转换为机器,但我们通常会将与高级编程语言相关联的编译器视为从CPU指令。

构建一个完整的程序包括以程序集或更高级别的语言(如C ++)为程序编写源代码。源代码被汇编(用于汇编代码)或编译(用于更高级语言)到目标代码,并且各个模块被链接在一起以成为最终程序的机器代码。在非常简单的程序的情况下,可能不需要链接步骤。在其他情况下,例如使用IDE(集成开发环境),可以一起调用链接器和编译器。在其他情况下,可以使用复杂的 make 脚本或解决方案文件来告诉环境如何构建最终的应用程序。

还有解释语言,其行为方式不同。解释语言依赖于特殊解释程序的机器代码。在基本级别,解释器解析源代码并立即将命令转换为新的机器代码并执行它们。现代解释器(有时也称为运行时环境虚拟机)要复杂得多:一次评估源代码的整个部分,在可能的情况下进行缓存和优化,以及处理复杂的内存管理任务。解释语言也可以预编译为较低级别的中间语言或字节码,类似于汇编代码。

答案 1 :(得分:115)

其他答案很好地描述了差异,但你也要求视觉效果。这是一个显示他们从C代码到可执行文件的过程的图表。

答案 2 :(得分:47)

汇编代码是机器代码的人类可读表示:

mov eax, 77
jmp anywhere

机器代码是纯十六进制代码:

5F 3A E3 F1

我假设你的意思是对象代码,就像在目标文件中一样。这是机器代码的一种变体,不同之处在于跳转是一种参数化,以便链接器可以填充它们。

汇编程序用于将汇编代码转换为机器代码(目标代码) 链接器链接多个对象(和库)文件以生成可执行文件。

我曾经用纯十六进制编写汇编程序(没有可用的汇编程序),幸运的是这回到了古老的(古代)6502上。但我很高兴有奔腾操作码的汇编程序。

答案 3 :(得分:17)

8B 5D 32是机器代码

mov ebx, [ebp+32h]是汇编

包含lmylib.so

8B 5D 32是目标代码

答案 4 :(得分:7)

尚未提及的一点是,有几种不同类型的汇编代码。在最基本的形式中,指令中使用的所有数字必须指定为常量。例如:

$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的任何地址。使用这种类型的汇编程序使编写和编辑代码比使用手工键和手工维护所有地址更容易。

答案 5 :(得分:2)

源代码,汇编代码,机器代码,目标代码,字节代码,可执行文件和库文件。

对于大多数人来说,所有这些术语通常会使他们感到困惑,因为他们认为它们是互斥的。请参阅图以了解它们之间的关系。每个术语的说明如下。


Types of code


源代码

人类可读(编程)语言的指令


高级代码

以高级(编程)语言编写的指令
例如C,C ++和Java程序


汇编代码

用汇编语言(一种低级编程语言)编写的指令。 作为编译过程的第一步,高级代码将转换为这种形式。是汇编代码,然后将其转换为实际的机器代码。在大多数系统上,这两个步骤是在编译过程中自动执行的。
例如program.asm


目标代码

编译过程的产物。它可以是机器码或字节码的形式。
例如file.o


机器代码

机器语言指令。
例如a.out


字节码

可以由诸如JVM之类的解释器执行的中间形式的指令。
例如Java类文件


可执行文件

链接过程的产物。它们是可以直接由CPU执行的机器代码。
例如.exe文件。

请注意,在某些情况下,包含字节码或脚本语言指令的文件也可能被视为可执行文件。


库文件

出于各种原因(例如,可重用性以及以后由可执行文件使用),某些代码被编译成这种形式。

答案 6 :(得分:1)

讨论汇编代码here

“汇编语言是编程计算机的低级语言。它实现了编程特定CPU架构所需的数字机器代码和其他常量的符号表示。”

讨论了机器代码here

“机器代码或机器语言是由计算机的中央处理单元直接执行的指令和数据系统。”

基本上,汇编程序代码是语言,它由汇编程序(类似于编译器)转换为目标代码(CPU运行的本机代码)。

答案 7 :(得分:1)

我认为这些是主要的差异

  • 代码的可读性
  • 控制你的代码在做什么

可读性可以使代码在创建后的6个月内得到改进或替换,另一方面,如果性能至关重要,您可能希望使用低级语言来定位您将在生产中使用的特定硬件,所以要加快执行速度。

IMO今天的计算机足够快,让程序员可以通过OOP快速执行。

答案 8 :(得分:1)

汇编是人类可以理解的简短描述术语,可以直接转换为CPU实际使用的机器代码。

虽然人类可以理解,但汇编程序仍处于较低水平。做任何有用的事情都需要很多代码。

所以我们使用更高级别的语言,如C,BASIC,FORTAN(好吧,我知道我已经过时了)。编译时这些产生目标代码。早期语言使用机器语言作为目标代码。

如今的许多语言,例如JAVA和C#通常编译成非机器代码的字节码,但在运行时很容易被解释为生成机器代码。

答案 9 :(得分:-1)

程序的源文件被编译成目标文件,然后链接程序将这些目标文件链接在一起,生成一个可执行文件,其中包括体系结构的机器代码。

目标文件和可执行文件都涉及通过文本编辑器打开时可打印和不可打印字符形式的体系结构机器代码。

尽管如此,文件之间的二分法是目标文件可能包含未解析的外部引用(例如,printf)。因此,它可能需要与其他目标文件链接。也就是说,需要解析未解析的外部引用,以便通过与其他目标文件(例如C / C ++运行时库的链接)链接来获得可运行的可执行文件。