汇编代码vs机器代码vs对象代码?
目标代码,机器代码和汇编代码有什么区别?
你能举一个他们区别的视觉例子吗?
机器码是二进制(1和0)的代码,可以直接由CPU执行。 如果要在文本编辑器中打开“机器代码”文件,则会看到垃圾,包括不可打印的字符(不,不是那些不可打印的字符;))。
对象代码是尚未链接到完整程序的机器代码的一部分。 这是构成完成产品的特定库或模块的机器代码。 它也可能包含在完成的程序的机器代码中找不到的占位符或偏移量,链接器将使用它来将所有内容连接在一起。
汇编代码是纯文本和(某种程度上)人类可读的源代码,它们与机器指令大体上是直接的1:1模拟。 这是使用助记符为实际的指令/寄存器/其他资源。 例子包括像JMP
或MULT
的跳转和乘法指令。 与机器码不同,CPU不理解汇编代码。
其他的答案给了很好的描述,但你也要求一个视觉。 这里是一个图表显示他们从C代码到可执行文件。
汇编代码是机器代码的人类可读表示:
mov eax, 77 jmp anywhere
机器码是纯粹的hex码:
5F 3A E3 F1
我假设你是指目标文件中的对象代码。 这是机器代码的一个变体,不同之处在于跳转是一种参数化,链接器可以填充它们。
汇编程序用于将汇编代码转换为机器代码(目标代码)链接程序链接多个对象(和库)文件以生成可执行文件。
我曾经写过一个纯粹的hex汇编程序(没有可用的汇编程序),幸运的是这已经回到了旧的(古代的)6502上。但是我很高兴有奔腾操作码的汇编程序。
8B 5D 32
是机器码
mov ebx, [ebp+32h]
是程序集
包含8B 5D 32
lmylib.so
是目标代码
尚未提及的一点是汇编代码有几种不同的types。 在最基本的forms中,指令中使用的所有数字都必须指定为常数。 例如:
$ 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开始的表中取出的不同颜色的多个行。 在某些工具上,input一个地址以及上面最上面一行的最右边部分,将存储中间列中显示的值,并使用以下地址开始下一行。 用这种formsinput代码比inputhex要方便得多,但是必须知道所有东西的确切地址。
大多数汇编器允许使用符号地址。 上面的代码会写得更像:
rainbow_lp: lda ColorTbl,x sta WSYNC sta COLUBK DEX bpl rainbow_lp
汇编器会自动调整LDA指令,以便引用映射到标签ColorTbl的任何地址。 使用这种汇编程序的风格使编写代码比编写代码要容易,如果必须手动键和手工维护所有地址。
汇编代码在这里讨论。
“汇编语言是编程计算机的低级语言,它实现了编程特定CPU架构所需的数字机器代码和其他常量的符号表示。
机器代码在这里讨论。
“机器码或机器语言是由计算机的中央处理单元直接执行的指令和数据的系统”。
基本上,汇编代码是语言,汇编程序(类似于编译器)将其转换为目标代码(CPU运行的本机代码)。
我认为这是主要的差异
- 代码的可读性
- 控制你的代码在做什么
可读性可以使代码改进或replace6个月之后,如果性能很重要,您可能希望使用低级语言来定位您将在生产中使用的特定硬件,以便获得更快的执行。
IMO今天的电脑速度足以让程序员通过OOP快速执行。
汇编是人类可以理解的简短的描述性术语,可以直接翻译成CPU实际使用的机器代码。
虽然有些人可以理解,但汇编还是很低级的。 它需要很多代码来做任何有用的事情。
因此,我们使用更高级的语言,如C,BASIC,FORTAN(好吧,我知道我已经约会了自己)。 当编译这些生成目标代码。 早期的语言有机器语言作为其对象代码。
现在很多语言如JAVA和C#通常编译成一个不是机器码的字节码,而是一个在运行时很容易被解释为产生机器码的字节码。