35

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

  • 在计算机汇编(或汇编)语言中,助记符是操作的缩写。在每条汇编程序指令的操作码字段中输入。例如AND AC,37,这意味着带有ANDAC寄存器37。所以AND和是SUB助记符MUL。它们由汇编器翻译。

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

4

6 回答 6

48

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

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

MNEMONIC : 英文单词 MNEMONIC 的意思是“帮助记忆某事的一种装置,例如字母、想法或联想的模式。”。因此,汇编语言程序员通常使用它来记住机器可以执行的“操作”,例如“ADD”、“MUL”和“MOV”等。这是汇编程序特定的。

机器代码:它是打开和关闭计算机中的开关以执行特定工作的数字序列 - 例如数字相加、分支、乘法等。这纯粹是机器特定的,由处理器的实现者。

汇编:有两个“汇编”——一个汇编程序是一系列助记符和操作数,这些助记符和操作数被馈送到“汇编器”,后者将助记符和操作数“汇编”成可执行的机器代码。可选地,“链接器”链接程序集并生成可执行文件。

基于“CLR”的语言(.NET 语言)中的第二个“程序集”是一个充满元数据信息的 CLR 代码序列,类似于可执行代码库,但不能直接执行。

于 2013-07-14T11:21:03.303 回答
34

Aniket 做得很好,但我也要试一试。

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

在早期,由于没有键盘、屏幕等,程序员会按字面意思打开和关闭开关以更改内存,打开或关闭灯以读出 1 和 0。随着时间的推移,内存变得越来越大,处理器变得越来越复杂,出现了显示设备和用于输入的键盘,并且有了更简单的编程方式。

释义 Aniket:

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

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

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

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

于 2013-07-14T15:31:06.100 回答
17

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

68 73 9D 00 01       PUSH 0x01009D73

68操作码。以下字节表示x86汇编语言的PUSH 指令。PUSH 指令将 4 字节(32 位)长度的数据压入堆栈。PUSH这个词只是代表操作码68助记符字节68、73、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
于 2017-01-01T10:07:04.747 回答
2

“汇编”起源于非常早期的代码“汇编器”,它可以从多个文件(我们现在称之为“包含”文件)“组装”程序。(但请注意,“文件”通常是卡片组。)使用术语“汇编语言”来指代代码的助记符表示是“汇编程序”的反向格式,并且有些不精确,因为许多“汇编器”不支持包含文件,因此不“汇编”。

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

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

于 2013-07-14T11:55:24.250 回答
1

最近我读到了一篇关于这方面的好文章,Opcode 和 Bytecode 之间的区别,因此希望与对此主题进行了很好的解释的人分享。所有功劳归原作者所有

操作码与字节码

  • 操作码

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

  • 字节码

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

于 2017-02-28T08:46:16.610 回答
-3
  • 机器代码是二进制的,但助记符是想法、字母(MOV、ADD 等)
  • 机器码是语言,但助记码是汇编语言的一部分
于 2015-04-02T12:09:48.133 回答