外阴瘙痒用什么药膏好| 吃什么油最健康排行榜| 什么是肝性脑病| 十一月底是什么星座| 血压高有什么症状| 断子绝孙是什么意思| 神经性呕吐是什么症状| 不约而至是什么意思| 夏季适合种什么花| 混合性皮肤用什么护肤品比较好| 看灰指甲去医院挂什么科| 凤冈锌硒茶属于什么茶| 产检挂什么科| 糖尿病早餐吃什么好| 无忧是什么意思| 什么大什么功| 户口分户需要什么条件| 可逆是什么意思| 白鹭吃什么| 八月五号是什么星座| 喝什么能减肥| 甲亢可以吃什么| 湖北属于什么地区| 牙发黑是什么原因怎么办| 什么是保健品| 得了梅毒会有什么症状| 嗨体水光针有什么功效| 什么是外阴| 崎岖是什么意思| 激光脱毛对身体有什么危害| 什么钙片最好| 鱼香肉丝属于什么菜系| 眼睛肿疼是什么原因引起的| uc是什么| 开字五行属什么| 咳嗽吃什么好的快偏方| 牙齿像锯齿是什么原因| 就诊卡是什么| 什么叫高脂血症| 身在其位必谋其职是什么意思| 2025年是什么命| 漱口杯什么材质好| 孕妇羊水少吃什么补的快| 牙根发黑是什么原因| 蒲公英能治什么病| 怀孕前三个月不能吃什么| 黄毛是什么意思| 醛固酮高吃什么降压药| hbcab偏高是什么意思| 吃什么代谢快有助于减肥| 4月29号是什么星座| 同房后为什么会出血| 梦到狗是什么意思| 激光是什么| fte是什么意思| 失眠吃什么中成药| 海绵体修复吃什么药| 山药炖什么好吃| 7月8号是什么日子| 懦弱的近义词是什么| 儿童登机需要什么证件| 亚硝酸钠是什么| 金字旁的字与什么有关| mbc是什么意思| 春天有什么植物| 上午9点是什么时辰| 身上起红斑是什么原因| 1941属什么生肖| 什么的遐想| 空调外机风扇不转是什么原因| 贝字旁的字和什么有关| 旅长是什么级别| 鸟对什么| 什么是辅酶q10| 弥漫什么意思| 生姜什么时候种植最合适| 肠易激综合征吃什么中成药| 君山银针属于什么茶| 肚子上方中间疼是什么部位| 黄色裤子搭配什么颜色上衣| 大海里面有什么| 迷失自我是什么意思| jimmy是什么意思| 身份证上的数字是什么字体| 欲仙欲死是什么意思| 两个百字念什么| 国家的实质是什么| 婴儿喝什么奶粉最好| 医院特需门诊什么意思| 吃什么促进消化| mv是什么意思| sod是什么意思| 日照有什么好吃的| 横梁是什么| 1960年属鼠的是什么命| 治疗胃反酸烧心用什么药最好| 什么是混合磨玻璃结节| 西洋参和人参有什么区别| 已是什么意思| 手爆皮是什么原因| 白羊座是什么星象| 什么是萎缩性胃炎| 病入膏肓是什么意思| 噗噗噗是什么意思| 孕早期不能吃什么食物| 康复治疗技术学什么| 脑供血不足用什么药好| 吃什么能提高免疫力| 女人消瘦应该检查什么| 干将是什么意思| 月经期间不能吃什么| 6月6是什么节日| 生姜泡醋有什么功效| 痛风吃什么食物| 老年人腿肿是什么原因引起的| 贫血吃什么最好| 水痘疫苗什么时候接种| 长公主是什么意思| 手臂突然疼痛什么原因| 海参和辽参有什么区别| 紫苏是什么| 慈禧属什么生肖| 一个兹一个子念什么| 无缘无故吐血是什么原因| 战国时期是什么时候| 冬天有什么水果| 吃百合有什么好处| 帝陀表什么档次| 灰枣和红枣有什么区别| 阿哥是什么意思| 我是小姨的什么人| 逆爱是什么意思| 什么的大自然| 40年属什么| zara是什么品牌| 开理疗店需要什么证件| 什么颜色显瘦| 蚊虫叮咬红肿用什么药快速消肿| 棠字五行属什么| 大作是什么意思| 衣禄是什么意思| 男人喜欢什么| 包皮开裂是什么原因| 艺伎什么意思| 孕妇血糖高对胎儿有什么影响| 吐黄痰是什么原因| 毛新宇什么级别| 什么血型生出o型血| 否认是什么意思| 大马猴是什么意思| 肾气不足是什么原因| 晚上老咳嗽是什么原因| 盘尼西林是什么药| 最好的止疼药是什么药| 孩子睡觉咬牙齿是什么原因引起的| 痔疮是什么样子的| 三个七念什么| 物色是什么意思| 空调出的水是什么水| 义愤填膺是什么意思| 12月13日是什么纪念日| 贻字五行属什么| dx什么意思| 肉桂和桂皮有什么区别| 什么都值得买| 血脂高吃什么药好| 长史相当于现在什么官| 金牛座女和什么星座最配| 桃子又什么又什么填空| 徐峥的老婆叫什么名字| 送行是什么意思| 考护师需要什么条件| 栖字五行属什么| 着凉了吃什么药| 2013属什么生肖| 什么是黑咖啡| 宽带m是什么意思| 月经推迟是什么原因| 陪跑什么意思| 什么经验| hbr是什么意思| 锋芒毕露是什么意思| 指腹为婚是什么意思| 什么的烤鸭| 如何知道自己是什么星座| 儿童风寒感冒吃什么药| 维生素c偏高是什么原因| 坐月子吃什么下奶最快最多最有效| 吃蜂蜜不能吃什么食物| 肾结晶是什么病| 口嗨是什么意思| 连襟是什么关系| 鲈鱼不能和什么一起吃| 去医院看嘴唇挂什么科| 散文是什么意思| 楼房风水主要看什么| 花金龟吃什么| 处女座的幸运色是什么颜色| 过年为什么要吃饺子| 品种是什么意思| 震仰盂什么意思| eb是什么| 误人子弟什么意思| 马齿苋长什么样子| 灼热感是什么样的感觉| hrd是什么| 晚上吃什么能减肥| 手指缝溃烂擦什么药膏| 心脏疼吃什么药| 色拉油是什么油| 把脉能看出什么隐私| 笋不能和什么一起吃| 龙和什么相冲| 梦见捡到钱是什么征兆| 高兴地什么| 6月19是什么星座| 腿酸胀是什么原因| 突然眩晕是什么原因| 除日是什么意思| 文才是什么意思| 出单是什么意思| 毛囊炎用什么药| 反式脂肪酸是什么意思| 头大脸大适合什么发型| 鳑鲏吃什么| 小腿抽筋是什么原因引起的| 78是什么意思| 椁是什么意思| 印记是什么意思| 医学检验技术是干什么的| 孔雀吃什么食物| 啧啧啧什么意思| 小孩子手脚脱皮是什么原因| 1995年属什么| 新生儿足底采血检查什么项目| 背部疼痛挂什么科| 吃饭就吐是什么原因| 野兔子吃什么| 谷草谷丙比值偏高代表什么| 蚂蚁的触角有什么作用| 猴子下山的故事告诉我们什么| 吃什么降胆固醇| 10.8号是什么星座| 口牙是什么意思| 圆谎是什么意思| 总是心慌是什么原因| 前列腺增生有什么症状表现| 柠檬有什么功效和作用| 什么是高脂血症| 小孩早上起床咳嗽是什么原因| 反酸是什么症状| 病案首页是什么| 隔桌不买单是什么意思| 小儿疳积是什么症状| 涅盘是什么意思| 双字五行属什么| 什么是股癣| 晚的反义词是什么| 安利是什么意思| 顺丰到付是什么意思| 乳房疼是什么原因| 月经没来吃什么药可以催月经来| 花裤子配什么上衣| 梦见被蛇追是什么意思| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? STM32 ? 简单!代码原来是这样被CPU跑起来的

共1条 1/1 1 跳转至

简单!代码原来是这样被CPU跑起来的

高工
2025-08-04 15:18:04     打赏
百度 李可染以传统中国画启蒙,兼学水彩,后又改学油画,转投过多位名师,曾是林风眠的学生,与徐悲鸿关系密切,拜师齐白石,师法黄宾虹。

CPU对我们来说既熟悉又陌生,熟悉的是我们知道代码是被CPU执行的,当我们的线上服务出现问题时可能首先会查看CPU负载情况。陌生的是我们并不知道CPU是如何执行代码的,它对我们的代码做了什么。本文意在简单解释我们代码的生命周期,以及代码是如何在CPU上跑起来的。


编译-让计算机认识我一个漂亮 control c 加上一个漂亮的 control v,啪~,我们愉快的写下了代码,当代码被保存后,它就被存在我们磁盘的某个地方,它可能是像java或者python这些高级语言写的,也可能是像c这种古老语言写的,但是现在它肯定没法被运行,因为计算机不认识它们,计算机只认识0、1这样的二进制,简称机器码,那为什么我们不直接写机器码?如果你有这样的思考,我只能呵呵了,请你帮我翻译下以下机器码:


001010100101001001001
100100101000101010101
很明显作为高质量人类的我们也无法识别出这段代码写的是什么,于是出现类似java这样的高级语言,它们给机器码穿上了一层外衣,然后交给伟大的程序员来创造未来。

所以反过来我们的代码需要被替换成机器码,这样才能被计算机认识,计算机才能帮我们干事。这个转换的过程我们通常叫「编译」。


#include
int main()
{
printf("Hello World\n");
return 0;
}
这是一段应该每个程序员都写过的代码(hello.c),在Linux下,当我们使用GCC来编译Hello World程序时,只需要最简单的命令:

gcc hello.c
./hello
# Hello World
看似很简单的一行,但是其实编译的过程很复杂,并不是我们想象中的编译,真实是分为4个步骤,分别是预处理(Prepressing)、编译(Compliation)、汇编(Assertmbly)和链接(Linking)。

预编译:这个过程主要是处理源代码中以“#”开始的预编译指令,比如“#include”、“define”等。编译:这个过程就是把预处理完的文件进行词法分析、语法分析、语义分析及优化后生产成相应的汇编代码,这个过程是最复杂的。汇编:这个过程就是将汇编代码转换成机器码,也就是上图的目标文件hello.o链接:我们的代码程序经常是由多个代码文件组成的,当每个文件都被汇编成“.o”文件时,需要一套机制将它们「组装」在一起,这个过程就叫做链接。好吧,原来编译是这么回事,通过这一整套的编译操作,我们代码终于能执行了,我们简简单单的运行

./hello.out即可输出Hello World。等等,这个简简单单的过程发生了什么?

连接-中转站和高速公路ok,ok,通过编译,我们的程序终于能执行了,接下来让我们站在CPU的视角来看看Hello World是如何被打印出来的。


首先编译好的文件是存在磁盘上的,得先加载到内存中,这里你可能会问:为什么CPU不能直接读取磁盘的程序运行而要经过内存?答案是慢,缓慢的磁盘会影响我们程序执行的速度,因此需要更加快速、离CPU更近的存储,那就是内存。


内存是一大块存储空间,可以存储很多数据信息,那么如何找到我们要写的程序呢?答案是地址,其实每个字节在内存中都有一个地址,这样当CPU去内存中读我们的程序时,只需要根据对应的地址就可以知道我们程序的具体内容。


等等...,这里似乎又有个问题,CPU是如何与我们的内存、磁盘通信的?应该有个媒介之类的吧。没错,这个媒介就是主板上的总线和芯片组,总线好理解,就像高速公路,数据信息可以通过这条高速公路传递到CPU中,这个芯片组是个什么玩意?电脑主板上芯片很多,这里说的主要是南桥芯片和北桥芯片。先来个解释:


北桥芯片:北桥负责高速设备和CPU之间的沟通,主要就是CPU和内存、显卡之间的通信,但是随着技术的迭代,主板上的北桥芯片已经被内置到了CPU里了。南桥芯片:南桥负责低速设备和北桥之间的通信,主要负责I/O总线之间的通信,如USB、LAN、ATA、SATA、音频控制器、键盘控制器、实时时钟控制器、高级电源管理等。嗯... 为什么CPU与高速设备、低速设备之间的通信需要这两个芯片?CPU自己不能干吗?这里还是类似拆分任务的功能,如果把所有的任务都交给CPU来处理,CPU会太忙了,还有比较重要的一点,如果南桥芯片坏了,那么我们可以直接更换南桥,而不用换掉整个CPU。


终于CPU通过总线和芯片打通了磁盘、内存之间的通信了,接下来的一切开始交给CPU。


CPU-最强大脑CPU全称是Central Processing Unit,即中央处理单元,它的本质就是一块超大规模的集成电路。从逻辑上来分,它的内部是由寄存器、控制器、运算器和时钟组成的,下面来解释下各个组成是干什么的。


寄存器:CPU内部其实有很多类型的寄存器,我们只需了解寄存器就是暂存数据、指令等信息的,它的本质是临时存储,由于是直接集成在CPU内部,所以读写它们的速度很快,一般一个CPU内部会有20-100个寄存器,这里给大家列举下常用寄存器与其功能。


累加寄存器:存储执行运算的数据和运算后的数据标志寄存器:存储运算处理后的CPU的状态程序计数器:存储下一条指令所在内存的地址基址寄存器:存储数据内存的起始地址变址寄存器:存储基址寄存器的相对地址通用寄存器:存储任意数据指令寄存器:存储指令,CPU内部使用,程序员无法通过程序对该寄存器进行读写操作栈寄存器:存储栈区域的起始地址控制器:控制器负责把数据读出或者写入寄存器,并根据指令的结果来控制计算机。


运算器:从名字就可以猜出来,运算器的主要工作就是运算,运算从内存读入寄存器的值


时钟:它并不是我们见的钟表概念,它代表了你的CPU的工作频率,频率越高说明你的CPU处理的速度越快,但是越快就会带来另一个问题:散热。


综上所述,CPU的大致工作流程如下:在时钟信号到来的时候,就开始工作,通过控制器把内存的数据读到各个寄存器中,然后如果有计算相关的逻辑,就交给运算器。发现没有,CPU的工作其实挺简单的,本质就是不停的读指令、执行指令。但是CPU是如何读到我们的代码指令的,以及我们的代码里面的if else、函数调用都是如何执行分支判断、函数跳转的,我们来看个例子:


a = 1 #0x0010
b = 2 #0x0011
if a > b { #0x0012
printf("%s","a") #0x0013
} else {
add(a,b) #0x0014
}
printf("%s","end") #0x0017

func add(int a,int b) { #0x0020
return a b
}
这是段非常简单的伪代码,有分支判断、有函数跳转。我们来从CPU的角度看看它是如何执行的:

首先每段程序都有个开始的地址0x0010,也就是CPU读取程序的入口把a=1这个数字读入通用寄存器中,程序计数器(PC寄存器)自动加1,即指向下一条指令 0x0011指令寄存器拿到程序计数器的指令地址,把b=2这个数字读入通用寄存器中,程序计数器(PC寄存器)自动加1,即指向下一条指令0x0012指令寄存器发现此处是比较逻辑,会执行a-b,此时可能会有三个结果分别是大于0,等于0,小于0,然后把这个结果存到标志寄存器里,这里有个小知识,我们经常说的是CPU是64位或者32位,其实也表示了标志寄存器的长度很明显,a是小于b的,CPU根据标志寄存器的状态值应该跳转到else里面,注意这时程序计数器的值不是加1,而是设置成else的地址 0x0014,当执行到0x0015的时候,需要发生函数跳转,程序计数器会被设置成 0x0020,但是这里并不是简单的函数跳转(专业术语叫做call),因为在函数执行完毕之后,还要返回,也就是程序计数器需要从0x0020再变成0x0017。call执行的时候会把后续要执行的指令地址0x0017存到栈中。当我们的add函数执行完毕之后,会有个return,return的时候会把上一步骤存入栈中的地址0x0017写入程序计数器中指令寄存器根据程序计数器当前的地址执行最后的打印(end),结束。顺序执行的指令代码,程序计数器会自动累加(当然不一定累加的是1),然后找到下一条要执行的指令。


分支判断的时候,程序计数器不是简单的累加地址,需要地址的跳转。


函数调用不仅仅需要跳转地址,还要把函数执行完毕之后要执行的地址存下来,方便折回继续执行。


其实还有个循环执行,也就是我们代码中的for、while之类的,这时程序计数器会不停的在某些地址之间来回切换。





关键词: 简单     代码     原来     这样    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
肝脓肿是什么原因引起的 598是什么意思 董事总经理是什么职位 木木耳朵旁是什么字 吃什么能补雌激素
ab型血生的孩子是什么血型 什么是邪教 肝气犯胃吃什么中成药 胆汁反流性胃炎吃什么中成药 活好的女人有什么表现
查微量元素挂什么科 dtc什么意思 人为什么要死 今天属相是什么生肖 1987年出生属什么生肖
皮肤发红发烫是什么原因 心灵鸡汤什么意思 七月份生日是什么星座 dj管是什么 月经期间同房有什么危害
流产后不能吃什么东西hcv9jop0ns8r.cn 起水痘不能吃什么食物hcv8jop5ns4r.cn 独行侠是什么意思hcv9jop7ns4r.cn 白带发黄是什么妇科病inbungee.com 一班三检是指什么hcv7jop5ns1r.cn
黄粱是什么意思hcv9jop1ns6r.cn 骨客念什么hcv8jop8ns2r.cn 喝什么睡眠效果最好hcv9jop0ns7r.cn 左手大拇指抖动是什么原因kuyehao.com 重心是什么hcv7jop6ns2r.cn
孤帆远影碧空尽的尽是什么意思dayuxmw.com 属蛇的和什么属相最配hcv8jop8ns1r.cn 县长什么级别hcv8jop2ns9r.cn b站是什么hcv8jop0ns2r.cn 胃出血有什么症状hcv9jop3ns2r.cn
乳腺癌有什么症状hcv7jop5ns5r.cn 喝酒不能吃什么东西hcv9jop2ns3r.cn 堂哥的女儿叫什么hcv9jop6ns3r.cn 干什么挣钱快hcv7jop9ns5r.cn 占便宜是什么意思baiqunet.com
百度