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

Ahm*_*her 32 assembly

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

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

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

Ani*_*nge 42

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

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

MNEMONIC:英文单词MNEMONIC意为"一种设备,如字母,想法或协会的模式,有助于记住某些东西." 因此,汇编语言程序员通常使用它来记住机器可以执行的"操作",例如"ADD","MUL"和"MOV"等.这是汇编程序特定的.

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

汇编:有两个"汇编" - 一个汇编程序是一系列助记符和操作数,它们被馈送到"汇编程序",它将助记符和操作数"汇编"成可执行的机器代码.可选地,"链接器"链接组件并产生可执行文件.

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


Nic*_*ick 30

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

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

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

释义Aniket:

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

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

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

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


Fır*_*ÇÜK 11

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

68 73 9D 00 01       PUSH 0x01009D73
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 感谢这一点——但为什么 Java 需要生成字节码?为什么它不能只创建机器代码(取决于它使用的机器)并跳过中间步骤? (2认同)
  • @Moondra 因为流动性。Java 的主要座右铭是“一次编写,到处运行”,因此您可以在每个平台上运行相同的可执行文件。否则必须根据CPU或操作系统编译代码。 (2认同)