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

问题描述 投票:206回答:9

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

你能举出他们差异的视觉例子吗?

assembly machine-code object-code
9个回答
266
投票

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

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

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

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

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


116
投票

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


47
投票

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

mov eax, 77
jmp anywhere

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

5F 3A E3 F1

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

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

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


17
投票

8B 5D 32是机器代码

mov ebx, [ebp+32h]是集会

包含lmylib.so8B 5D 32是目标代码


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


2
投票

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

所有这些术语对于大多数人来说往往非常混乱,因为他们认为这些术语是相互排斥的。请参阅图表以了解他们之间的关系。每个术语的描述如下。

Types of code

Source code

人类可读(编程)语言的说明

High-level code

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

Assembly code

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

Object code

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

Machine code

机器语言说明。 例如,a.out

Byte code

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

Executable file

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

注意,在某些上下文中,包含字节代码或脚本语言指令的文件也可以被认为是可执行的。

Library file

一些代码被编译成这种形式,原因有很多,例如可重用性,后来被可执行文件使用。


1
投票

汇编代码讨论here

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

机器代码讨论here

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

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


1
投票

我认为这些是主要的区别

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

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

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


1
投票

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

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

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

今天的许多语言,例如JAVA和C#,通常编译成不是机器代码的字节码,但可以在运行时轻松解释以生成机器代码。

© www.soinside.com 2019 - 2024. All rights reserved.