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

mmc*_*ole 215 assembly machine-code object-code

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

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

Joe*_*orn 273

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

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

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

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

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

  • +1:很好,但有些简化了答案 - 并非所有汇编指令都以1:1的形式转换为机器指令,而目标文件也可能包含其他数据(重定位信息,符号表......) (21认同)
  • 为您的第一期添加了一个狡猾的词,编辑以使第二个更清晰. (5认同)
  • @Olof:RISC架构有时提供汇编级虚拟指令集 - 例如MIPS伪指令(http://en.wikipedia.org/wiki/MIPS_architecture#Pseudo_instructions) (5认同)
  • @Panzercrisis汇编程序没有添加任何东西.它是您写入实际机器指令的直接翻译.而且我不会把编译器输入的额外代码称为"不必要的" (3认同)
  • @Christoph:你说"并非所有汇编指令都按1:1翻译成机器指令"请举个例子. (2认同)
  • @Panzercrisis机器代码是唯一运行的代码.在汇编代码可以在计算机上运行之前,汇编程序必须首先将其转换为机器代码.在这种情况下,你的问题毫无意义,因为在运行时它们是同一个东西. (2认同)

Gra*_*oob 121

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

  • 实际上,目标代码和可执行代码都是机器代码.区别在于目标代码不是已完成的程序.它需要与图中所示的其他辅助库/模块代码组合,以形成完整的可执行程序/代码. (5认同)
  • 我发现这非常有用,但它缺少"机器代码"标签 (3认同)
  • 在该图的上下文中,"目标代码"是机器代码. (3认同)

Too*_*the 47

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

mov eax, 77
jmp anywhere
Run Code Online (Sandbox Code Playgroud)

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

5F 3A E3 F1
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 不不不不.机器代码不是十六进制代码.它是纯二进制的.十六进制代码只是二进制的方便表示. (74认同)
  • 如果我们真的走极端,它不是二进制,它是电路中存储的电量.;-) (54认同)
  • 当然是.十六进制和你称之为"机器代码"之间存在关系,但是说十六进制*是*机器代码并不十分准确.这就是我想说的. (17认同)
  • @Breton从这个意义上说,没有"十六进制代码"这样的东西吧?"十六进制代码"只是查看机器代码的一种方式.您可以以十六进制,二进制,八进制,十进制或您喜欢的方式查看机器代码.同样在这个意义上,也没有"二进制代码".同样,"二进制代码"只是查看机器代码的一种方式. (9认同)
  • @Breton你所说的并不是很有意义.二进制是一种表示方式,就像十六进制一样.如果它不是十六进制,它也不是二进制. (9认同)
  • @hippietrail 十六进制的要点在于它是二进制的简洁简写符号。每个十六进制数字直接映射为 4 位:0000=0、0001=1、0010=2、0011=3、0100=4、0101=5、0110=6、0111=7、1000=8、1001=9、1010 =A、1011=B、1100=C、1101=D、1110=E、1111=F。因此,您可以用一个十六进制数字对一个字节的每个半字节进行编码,一个字节用两个十六进制数字进行编码。如果您知道映射,则只需查看十六进制数字就几乎可以算出二进制位。不过,对于十进制来说,这并不容易,因为对于十进制数字,映射不是 1:1。这就是为什么十六进制更可取。 (3认同)

Qua*_*noi 18

8B 5D 32 是机器代码

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

lmylib.so包含8B 5D 32是对象代码


sup*_*cat 8

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

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


Ber*_*yle 5

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

对于大多数人来说,所有这些术语通常都非常令人困惑,因为他们认为它们是相互排斥的。查看图表以了解它们的关系。下面给出了每个术语的描述。


代码类型


源代码

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


高级代码

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


汇编代码

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


目标代码

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


机器码

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


字节码

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


可执行文件

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

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


库文件

一些代码出于不同的原因被编译成这种形式,例如可重用性和以后由可执行文件使用。