机器代码
编辑在计算机编程中,由机器语言指令组成的机器代码是一种低级编程语言,用于直接控制计算机的中央处理器(CPU)。每条指令使CPU对CPU寄存器或内存中的一个或多个数据单元执行非常特定的任务,例如加载、存储、跳转或算术逻辑单元(ALU)操作。
机器代码是一种严格的数字语言,旨在尽可能快地运行,并且可以被视为编译或组装的计算机程序的最低级表示形式,或者被视为原始的和硬件相关的编程语言。尽管可以直接用机器代码编写程序,但是管理单个位以及手动计算数字地址和常量既繁琐又容易出错。因此,在现代环境中,很少有程序直接用机器代码直接编写,但是可以用于低级调试、程序修补(尤其是在没有汇编源的情况下)和汇编语言反汇编。
如今,绝大多数实用程序都是用高级语言或汇编语言编写的。然后,通过实用程序(例如编译器、汇编器和链接器)将源代码转换为可执行的机器代码,但重要的例外是解释程序,这些程序未转换为机器代码。但是,解释器本身可以看作是执行源代码指令的执行器或处理器,通常由直接可执行的机器代码(从汇编或高级语言源代码生成)组成。
根据定义,机器代码是程序员可见的最低级别的编程详细信息,但是内部许多处理器使用微代码或将机器代码指令优化并将其转换为微操作序列。通常不将其视为机器代码。
机器代码的指令集
编辑每个处理器或处理器系列都有其自己的指令集。指令是位模式,通过物理设计对应于机器不同命令的数字或字符。因此,指令集特定于使用(主要是)相同架构的一类处理器。后继或派生处理器设计通常包括前任的所有指令,并可能添加其他指令。有时,后继设计会中断或更改某些指令代码的含义(通常是因为新目的需要使用),从而在一定程度上影响代码的兼容性;即使是几乎完全兼容的处理器对于某些指令而言也可能表现出稍有不同的行为,但这很少有问题。系统在其他细节上也可能有所不同,例如内存排列,操作系统或xxx设备。因为程序通常依赖于这些因素,所以即使使用相同类型的处理器,不同的系统通常也不会运行相同的机器代码。
处理器的指令集可以具有相同长度的所有指令,也可以具有可变长度的指令。模式的组织方式随特定的体系结构以及指令的类型而变化很大。大多数指令具有一个或多个操作码指定的基本指令类型(如算术、逻辑字段跳跃等)和实际操作(诸如加法或比较)等领域,其可以得到的类型的操作数(一个或多个),寻址模式,寻址偏移量或索引或实际值本身(指令中包含的此类常量操作数称为“立即数”)。
并非所有机器或单个指令都具有显式操作数。一个累加器机具有用于大多数算术指令的组合左操作数和结果在一个隐式蓄能器。其他体系结构(例如8086和x86系列)具有通用指令的累加器版本,长指令将累加器视为通用寄存器之一。一个堆栈机在隐式堆栈上具有大多数或所有操作数。专用指令通常也缺少显式操作数(例如:x86体系结构中的CPUID将值写入四个隐式目标寄存器)。显式和隐式操作数之间的这种区别在代码生成器中很重要,尤其是在寄存器分配和有效范围跟踪部分中。一个好的代码优化器可以跟踪隐式和显式操作数,这可以允许更频繁的常量传播,寄存器的常量折叠(为寄存器分配常量表达式的结果的寄存器,该常量表达式可以通过用该常量替换而释放),以及其他代码增强功能。
程序
编辑计算机程序是能够由执行指令的列表,中央处理单元(CPU)。完成程序的执行是为了使正在执行该程序的CPU解决特定的问题,从而获得特定的结果。尽管简单的处理器能够一个接一个地执行指令,但是超标量处理器却能够一次执行各种不同的指令。
程序流程可能会受到特殊的“跳转”指令的影响,这些指令将执行转移到数字后跟指令之外的另一条指令上。根据条件,是否进行条件跳转(执行在另一个地址处继续)或不执行(执行在下一条指令处继续)。
汇编语言
编辑机器语言的一种更具可读性的汇编语言,称为汇编语言,它使用助记符代码来指代机器代码指令,而不是直接使用指令的数字值,而使用符号名来指代存储位置,有时还指代寄存器。例如,在Zilog Z80处理器上,00000101
导致CPU递减B
处理器寄存器的机器代码将以汇编语言表示为DEC B
。
与字节码的关系
编辑机器代码通常与字节码(也称为p代码)不同,字节码可以由解释器执行,也可以自身编译为机器代码以更快(直接)执行。一种例外情况是,处理器被设计为直接使用特定的字节码作为其机器代码,例如Java处理器。
当引用语言功能或库的平台相关部分时,有时会将机器代码和汇编代码称为本机代码。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/116405/