区别:操作码,字节码,助记符,机器码和汇编

时间:2013-07-14 02:24:00

标签: assembly

我对此很陌生。我试图以清晰的方式理解上述术语之间的区别,但是,我仍然感到困惑。这是我发现的:

  • 在计算机汇编程序(或汇编)语言中,助记符是操作的缩写。它输入到每个汇编程序指令的操作代码字段中。例如AND AC,37表示AND AC注册37。所以ANDSUBMUL是助记符。它们由汇编程序翻译。

  • 汇编语言中的指令(语句)通常非常简单,与高级编程语言中的说明不同。通常,助记符是单个可执行机器语言指令(操作码)的符号名称,并且为每个机器语言指令定义至少一个操作码助记符。每条指令通常由一个操作或操作码,以及零个或多个操作数组成。

6 个答案:

答案 0 :(得分:41)

OPCODE :这是由您的机器(虚拟或硅片)解释的数字,表示要执行的操作

BYTECODE :与机器代码相同,但主要由基于软件的解释器(如Java或CLR)使用

MNEMONIC :英文单词MNEMONIC表示"一种设备,如字母,想法或协会模式,有助于记忆某些内容。"。因此,它通常由汇编语言程序员用来记住"操作"机器可以做,比如" ADD"和" MUL"和" MOV"这是汇编程序特定的。

机器代码:数字序列可以打开和关闭计算机中的开关以执行某项工作 - 例如添加数字,分支,乘法等。这纯粹是机器特定的,并由处理器的实施者充分记录。

汇编:有两个"程序集" - 一个汇编程序是一系列助记符和操作数,它们被馈送到"汇编程序"哪个"组装"将助记符和操作数转换为可执行的机器代码。可选地,#34;链接器"链接程序集并生成可执行文件。

第二个"组装" in" CLR"基于语言(.NET语言)是一系列CLR代码,其中包含元数据信息,可执行代码库,但不能直接执行。

答案 1 :(得分:29)

Aniket做得很好,但我也会去。

首先,要了解在最低级别,计算机程序和所有数据都只是数字(有时称为单词),在某种类型的内存中。最常见的是,这些字是8位(1和0)的倍数(例如32和64),但不一定,并且在某些处理器中,每个字都要大得多。无论如何,它只是表示为一系列的1和0的数字,或者如果你愿意的话,可以表示和关闭。这些数字的含义取决于什么/谁曾经读过它们,在处理器的情况下,它一次读取一个字,并根据它看到的数字(指令)采取一些行动。此类操作可能包括从内存中读取值,将值写入内存,修改已读取的值,跳转到内存中的其他位置以读取指令。

在很早的时候,程序员就会轻轻地打开和关闭开关来更改内存,打开或关闭指示灯以读出1和0,因为没有键盘,屏幕等等。随着时间的推移,内存变得越来越大,处理器变得越来越复杂,显示设备和输入的键盘被构思出来,并且有了更简单的编程方式。

释义Aniket:

OPCODE是指令字的一部分,处理器将其解释为表示要执行的操作,例如读,写,跳,加。许多指令还将具有影响指令执行方式的OPERANDS,例如说明从内存中读取或写入的位置,或跳转到何处。因此,如果指令的大小为32位,则处理器可以使用8位作为操作码,并且对于两个操作数中的每一个使用12位。

从切换开关开始,可以使用称为“监视器”的程序将代码输入到机器中。程序员将使用简单的命令来说明他们想要修改的内存,并以数字方式输入MACHINE CODE,例如在16(十六进制)中,使用0到9和A到F表示数字。

虽然比切换开关更好,但输入机器代码仍然很慢并且容易出错。从那里开始的是ASSEMBLY CODE,它使用更容易记住的MNEMONICS来代替表示指令的实际数字。 ASSEMBLER的工作主要是将程序的助记符形式转换为相应的机器代码。这使得编程更容易,特别是对于跳转指令,其中部分指令是要跳转到的存储器地址或要跳过的多个字。机器代码编程需要精心计算以形成正确的指令,如果添加或删除某些代码,则可能需要重新计算跳转指令。汇编程序为程序员处理这个问题。

这使得BYTECODE基本上与机器代码相同,因为它描述了低级操作,例如读写内存和基本计算。 Bytecode通常被认为是在编译更高级语言(例如PHP或Java)时生成的,并且与许多基于硬件的处理器的机器代码不同,可能具有支持更高级语言的特定功能的操作。一个关键的区别是字节码的处理器通常是一个程序,尽管已经创建了处理器来解释一些字节码规范,例如,用于Smalltalk字节码的称为SOAR(Smalltalk On A RISC)的处理器。虽然您通常不会调用本机机器码字节码,但对于某些类型的处理器(如CISC和EISC)(例如Linn Rekursiv,来自制作唱机的人),处理器本身包含一个解释机器指令的程序,所以有相似之处。

答案 2 :(得分:9)

以下行是反汇编的x86代码。

68 73 9D 00 01       PUSH 0x01009D73

68 操作码。对于字节,它代表x86 汇编语言的 PUSH 指令。 PUSH指令将4字节(32位)长度数据推送到堆栈。 PUSH这个词只是一个代表操作码68的助记符。每个字节 68 73 < / strong>, 9D 00 01 机器代码

机器代码适用于真机(CPU),但字节代码是虚拟机的伪机器代码。

编写java代码时。 java编译器编译代码并生成字节代码。 (.class文件),您可以在任何平台上执行相同的代码而无需更改。

                     JAVA CODE
                         |
                         |
                     BYTE CODE
         ________________|_______________
         |               |               |
      x86 JVM        SPARC JVM        ARM JVM
         |               |               |
         |               |               |
        x86            SPARC            ARM
   MACHINE CODE     MACHINE CODE    MACHINE CODE

答案 3 :(得分:2)

“汇编”源自非常早期的代码“汇编程序”,它将从多个文件“汇集”程序(我们现在称之为“包括”文件)。 (虽然注意“文件”通常是卡片组。)使用术语“汇编语言”来表示代码的助记符表示是“汇编程序”的反向形式,并且有些不精确,因为“汇编程序“不支持包含文件,因此不”汇编“。

值得注意的是,“汇编程序”是为了支持“子程序”而发明的。最初有“内部”和“外部”子程序。 “内部”子程序是我们现在称之为“内联”的,而“外部”子程序是通过原始的“调用”机制实现的。关于“外部”子程序是否是个好主意,当时存在很多争议。

“助记符”来自希腊神Mnemosyne的名字,Mnemosyne是记忆女神。任何可以帮助你记住东西的东西都是“助记设备”。

答案 4 :(得分:1)

最近我读了一篇关于此问题的好文章,Difference between Opcode and Bytecode,因此想与谁分享一个关于这个主题的好解释。 所有功劳归于原作者

Opcode vs Bytecode

  • <强>操作码

    操作码是操作码的缩写。顾名思义,操作码是一种代码,它告诉机器该做什么,即要执行什么操作。操作码是一种机器语言指令。

  • <强>字节码

    Bytecode本质上类似于opcode,因为它也告诉机器该做什么。但是,bytecode并非设计为由处理器直接执行,而是由另一个程序执行。
    它最常用于基于软件的解释器,如 Java CLR 。它们将每个通用机器指令转换为特定的机器指令或指令,以便计算机的处理器能够理解。
    实际上,名称bytecode来自指令集,它们具有一个字节的操作码,后跟可选参数

答案 5 :(得分:-3)

  • 机器代码是二进制的,但助记符是想法,字母(MOV,ADD等)
  • 机器代码是语言,但助记符代码是汇编语言的一部分