当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《汇编代码与机器代码对象代码?》经验,为你挑选了5个好方法。

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

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



1> Joel Coehoor..:

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

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

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

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

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


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

2> Graphics Noo..:

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


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

3> Toon Krijthe..:

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

mov eax, 77
jmp anywhere

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

5F 3A E3 F1

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

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

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


不不不不.机器代码不是十六进制代码.它是纯二进制的.十六进制代码只是二进制的方便表示.
如果我们真的走极端,它不是二进制,它是电路中存储的电量.;-)
当然是.十六进制和你称之为"机器代码"之间存在关系,但是说十六进制*是*机器代码并不十分准确.这就是我想说的.
@Breton从这个意义上说,没有"十六进制代码"这样的东西吧?"十六进制代码"只是查看机器代码的一种方式.您可以以十六进制,二进制,八进制,十进制或您喜欢的方式查看机器代码.同样在这个意义上,也没有"二进制代码".同样,"二进制代码"只是查看机器代码的一种方式.
@Breton你所说的并不是很有意义.二进制是一种表示方式,就像十六进制一样.如果它不是十六进制,它也不是二进制.

4> Quassnoi..:

8B 5D 32 是机器代码

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

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



5> supercat..:

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

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

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有