C语言、汇编语言、机器指令、CPU之间是怎么联系起来的?

紫碧落日月心


简单说说这几者的关联吧。

通常,C语言程序可被C编译器翻译成汇编语言编写的汇编程序,汇编程序被汇编器翻译成可执行代码,而可执行代码主要包括机器指令及其使用的数据。

举例子吧:


C和汇编

C语言代码:

int b = 3;
int a = 2 + b;

可被C编译器翻译成汇编代码(以x86 CPU为例):

movl $3, -8(%rbp)
movl -8(%rbp), %eax
addl $2, %eax

可以看出,第一行C代码被翻译成两行汇编代码,第二行C代码被翻译成一行汇编代码。C代码和汇编代码没有一一对应关系。

同一份C代码可被不同的C编译器翻译成不同的汇编代码,对应不同的CPU。


汇编代码和机器指令

接下来,上述三行汇编代码可被x86汇编器翻译成可执行代码,其中的机器指令如下:

c7 45 f8 03 00 00 00
8b 45 f8
83 c0 02

汇编代码与机器指令是一一对应的关系。每个不同的CPU家族,对应着不同的机器指令体系,也一一对应着相应的汇编语言体系。比如ARM和x86就是两个不同的体系。


机器指令和CPU

CPU是机器指令的执行者。通常,CPU从内存(RAM)中读取并逐条执行机器指令。


和不同


CPU的全称是中央处理单元,是计算机进行运算的核心,根据使用的技术不同,CPU又分为X86,X64,ARM、DSP、单片机等不同的体系结构。在每种CPU上都有一套特定的指令集,这就是人们常说的机器指令,直接使用机器指令编写的程序就是机器语言程序。

理论上来说,是可以通过机器语言直接编写任何程序的(早期都是直接使用机器语言编程,那时程序相对比较简单),并且编写的程序可以直接运行,但是使用机器语言编程对程序员的要求极高,代码无法移植且不便于人直接阅读,于是人们发明了一组符号,用来表示这些机器指令,这就是汇编语言。汇编语言编写的程序计算机无法直接运行,需要一个叫做汇编器的程序转换为机器语言才可以在特定机器上运行。

而C语言是比汇编语言更高级的语言,使用C语言编写的程序也是无法在计算机上直接运行的,它需要编译器将C语言代码转换为机器语言,这个过程又分为几个子步骤,见下图。

为了使题主的问题更加完善,在这里补充两个概念,链接器与反汇编。

在大型程序中,往往会将任务分解为许多不同的子任务,每个子任务对应一个源文件,在C语言中就是多个C文件,编译器将每个C文件编译成一个目标文件(一般在Windows中是obj文件,Linux中是

.o

文件),这些目标文件也是机器指令,但是缺少一些必要的信息,无法直接运行,需要链接器将这些文件链接起来,再加上一些库文件与可执行文件头信息,成为一个可执行文件(Windows是PE格式,Linux是ELF格式)。

通常,在查看一个二进制文件时(目标文件或者可行性文件),不会直接显示机器指令,而是以汇编语言显示,这是因为此过程中有一个反汇编程序,将机器指令转换为汇编语言,它的功能刚好与汇编过程相反。


编码之道


很高兴能够看到和回答这个问题,作为一个科技爱好者,我每天都在关注科技发展方面的消息,每天收获也蛮多的。

首先,我觉得这是一个非常好的问题,也是很多小白用户困惑之处,下面我将根据自己的经验认真回答这个问题。

处理器体系结构是处理器的硬件结构,称为微体系结构。它是一组硬件电路,用于执行一组命令中提供的操作。

一组指令决定了处理器的结构,因为它包含使用硬件电路实现一组指令。但是具体来说,使用哪种处理器体系结构,使用哪种硬件电路,每个设计都可以不同。

MIPS是使用简化指令集(RISC)的处理器体系结构,带有一组指令和相应的处理器体系结构。龙的著名核心是帕格。

编译语言是以人们理解的语言描述的一组指令

机器代码中的一组指令是一组很难理解的二进制数,但是编译以与人类语言相同的方式描述了一组指令,并且更易于阅读。

对于处理器的设计,首先必须具有一组指令,该一组指令规定了处理器的相应操作并通过一组指令执行相应的功能。但是处理器是一组只能识别二进制数据的硬件电路,因此,一组指令由几个二进制数据组成。而且二进制数据很难读取。为了方便使用一组命令,创建了描述该组命令的语言集合。编译后的语言类似于人类语言,并且易于阅读。

尽管编译语言更易于阅读,但也有缺点。第一种编译语言仍然很难工作。其次,编译语言与指令集相对应,因此,在更改指令集时,有必要更改相应的编译语言,这导致其移植性差且不能在不同平台上使用的事实。

例如,汇编语言ARM与IntelX86不同。目前,人们希望开发一种更便捷的操作,它超出了命令集的范围,因此有高级语言C,C ++。

但是处理器只能识别二进制代码,这如何区分高级语言?结果,人们开发了一种编译器,该编译器按以下顺序将高级语言转换为二进制:高级语言-汇编程序-二进制机器代码。

人们可以轻松地使用高级编程语言,处理器控制来执行相应的功能。然后程序员的职业“红色火焰”如雨后春笋般出现。

最后,我们在最高层(C / C ++ / C \\\\\\\\)编写的代码或程序通常会要求硬件轮廓使之如此随心所欲或以工作为辅。许多人的综合答案意思是,书面生成的更高层次是通过编译器进行转换和解释的,变成编译语言,机器语言,然后是硬件,或者上层代码将消息传递到驱动程序执行的级别我们想要。

但是,实际上,问题在于,即使切换到编译语言或机器代码,也就像较低层的设备可以理解的那样,发生在高层代码中。至于驱动力,它们也是软件,并以p语言编写。

实际上,在电路的底部,只有各种电流水平和波形(我们以不同的方式确定)才具有消息和信息。那么波浪的水平和形状如何符合我们的期望?

这个问题使我想到了使用纸带输入程序的最早阶段。纸带上有东西要打断电路并产生链条,如果纸带上有打印输出,则会产生张力。纸带上的铅的长度会产生一定程度的连续性,并且通过纸带控制的传输速度可提高代码执行速度。

对应于处理器和计算机南端的现代设计,处理器充当传送带。然后,“信号”一词就是处理器接收和读取我们的代码的方式。

在此基础上,处理器脚的电平继续运行处理器的内部逻辑,并将该电平带到电路的外围。如果已读取或成功读取了存储设备的内容,则将存储设备的其中一个爪子设置为允许您使用它的级别。处理器根据接收到的电平信息保留其内部逻辑。

处理器只能在其初始级别运行逻辑电路,因此处理器只能在发生主电的过程中访问存储器的某些部分。继续下一个特定部分的工作。

现在的问题是如何保存内存的内容,例如,数据如何变坏。最原始的是存储设备的内容必须是随机的(现代技术必须基于某种方法,根据该方法将存储设备依法释放到工厂,即在这里我们要讨论存储材料的特性。

这样的存储设备的内部逻辑应包括一个用于读取和写入的电平开关,可以通过逻辑对其进行更改。该存储设备必须在整个级别上进行更改,但是如果级别丢失,其状态将不会更改。

我仍然记得该程序是如何使用纸带编程的,纸带存储在纸带上并手工绘制。

这个问题与许多事物有关,包括编程语言 C ++ ,机器语言,驱动程序,IC参与,材料特性,本质计划。此外,此问题与尚未讨论的计算机科学和编码问题有关。

我相信大多数人不会对程序将在什么级别执行的问题进行深入研究,只是知道程序可以执行某些功能,调用某些AP可以实现所需的逻辑,却没有思考为什么可以认识到城市的硬件引擎是如何工作的。

此外,基于此,可以假定无法使用所有计算机,我们如何重新创建这些文明产品?如何继续使用人类语言,使机器能够按照我们的意愿工作?

CPU是主要的计算机设备之一,也是其主要部分。它的功能主要是解释计算机软件中的计算机指令和过程数据。

处理器是计算机的中央元件,负责读取命令,解码和执行命令。CPU主要由两部分组成,即:控制器,算术设备,还包括高速缓冲存储器和允许您在它们之间建立通信并控制总线的数据。计算机的三个主要组件是处理器,内部存储器,输入/输出设备。CPU的功能主要包括处理命令,执行操作,管理时间和处理数据。

在计算机系统的结构中,处理器是主要的硬件模块,用于控制计算机的所有硬件资源(例如驱动器,输入/输出单元)和执行常规操作。处理器是计算操作和控制的核心。计算机系统中所有软件级别的所有操作最终都将通过一组指令转换为处理器操作。

总结:

以上便是我的一些见解和回答,可能不能如您所愿,但我真心希望能够对您有所帮助!不清楚的地方您还可以关注我的头条号“每日精彩科技”我将竭尽所知帮助您!


分享到:


相關文章: