目标代码,机器代码和汇编代码之间有什么区别?
你能举出他们差异的视觉例子吗?
机器代码是二进制(1和0)代码,可以由CPU直接执行.如果您要在文本编辑器中打开机器代码文件,您会看到垃圾,包括不可打印的字符(不,不是那些不可打印的字符;)).
对象代码是尚未链接到完整程序的机器代码的一部分.它是构成完成产品的特定库或模块的机器代码.它还可能包含在已完成程序的机器代码中找不到的占位符或偏移量.该连接器将使用这些占位符和偏移一切连接在一起.
汇编代码是纯文本和(有些)人类可读取的源代码,它们大多数具有与机器指令直接1:1的模拟.这是使用助记符来实现实际指令,寄存器或其他资源.例子包括JMP
与MULT
对CPU的跳跃和乘法指令.与机器代码不同,CPU不了解汇编代码.您可以使用汇编程序或编译器将汇编代码转换为机器,尽管我们通常认为编译器与高级编程语言相关联,这些编程语言是从CPU指令中进一步抽象出来的.
构建一个完整的程序涉及用程序集或更高级语言(如C++)编写程序的源代码.源代码被汇编(用于汇编代码)或编译(用于更高级语言)到目标代码,并且各个模块被链接在一起以成为最终程序的机器代码.在非常简单的程序的情况下,可能不需要链接步骤.在其他情况下,例如使用IDE(集成开发环境),可以一起调用链接器和编译器.在其他情况下,可以使用复杂的make脚本或解决方案文件来告诉环境如何构建最终应用程序.
还有一些行为不同的解释语言.解释语言依赖于特殊解释程序的机器代码.在基本级别,解释器解析源代码并立即将命令转换为新的机器代码并执行它们.现代解释器(有时也称为运行时环境或虚拟机)要复杂得多:一次评估源代码的整个部分,尽可能地缓存和优化,以及处理复杂的内存管理任务.解释语言也可以预编译为较低级别的中间语言或字节码,类似于汇编代码.
其他答案给出了差异的良好描述,但你也要求视觉效果.这是一个图表,显示他们从C代码到可执行文件的过程.
汇编代码是机器代码的人类可读表示:
mov eax, 77 jmp anywhere
机器代码是纯十六进制代码:
5F 3A E3 F1
我假设你的意思是对象代码,就像在目标文件中一样.这是机器代码的变体,不同之处在于跳转是参数化的类型,以便链接器可以填充它们.
汇编程序用于将汇编代码转换为机器代码(目标代码)链接器链接多个对象(和库)文件以生成可执行文件.
我曾经用纯十六进制编写汇编程序(没有可用的汇编程序),幸运的是这回到了古老的(古代)6502上.但我很高兴有奔腾操作码的汇编程序.
8B 5D 32
是机器代码
mov ebx, [ebp+32h]
是集会
lmylib.so
包含8B 5D 32
是对象代码
尚未提及的一点是有几种不同类型的汇编代码.在最基本的形式中,指令中使用的所有数字必须指定为常量.例如:
$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的任何地址.使用这种类型的汇编程序使编写和编辑代码比使用手工键和手工维护所有地址时更容易.