# 语言这个东西?

首先说明下,我们正常使用的python、C++、C语言等等,我们自己能读得懂的语言,包括汇编语言,CPU都是不认识的,CPU 只认识一种语言,那就是 机器语言,也就是我们很多人,或者很多老师,或者很多老鸟,很多大佬都提到的 机器码

#机器码是什么?

机器码是CPU可以认识的,可以按照这个机器码去执行相对应指令的代码,我们可以认识它就是一些 十六进制 字符。

比如下面这些,就是机器码

:200000007592007591007590FFC294C295C29612001ED294D295D29612001E0200097DC8E5
:0B0020007EC87FF8DFFEDEFADDF6226E
:00000001FF

# CPU上电执行程序过程

RAM 和 ROM 是永远躲不开的话题,我们编译成的机器码最后会烧录到一个ROM的位置,这个位置保存的东西掉电可保存,这个是基本操作。

然后开机的第一件事,就是把ROM里面的程式,程式是很多台湾的工程师这样说明的,我们叫程序,不管叫什么,都是一堆二进制代码,把这些代码拷贝到RAM里面,然后CPU就从RAM的指定位置去开始执行程序。

很经典

#什么是汇编代码?

汇编代码和机器码是有对应关系的,所以我们很多时候分析一个C语言代码的流程,特别是那种未定义行为的时候,我们都反编译成汇编来看,汇编代码就代表了CPU的执行顺序,CPU就是按照汇编代码来执行对应的指令的。

如下是51单片机的一段汇编代码

;流水灯程序P1M0 DATA 092H
P1M1 DATA 091H
ORG 00H
MOV P1M0,#00000000B
MOV P1M1,#00000000B
MOV P1,#11111111BSTART:CLR P1.4        ; 置0,CLR P1.5        ; 置0,CLR P1.6        ; 置0,LCALL DELAY     ; 延时0.2sSETB P1.4       ; 置1,点亮LEDSETB P1.5       ; 置1,点亮LEDSETB P1.6       ; 置1,点亮LEDLCALL DELAY     ; 延时0.2sLJMP START      ; 进行重新循环
DELAY:MOV R5,#200      ; 执行MOV指令为1个机器周期
D1:MOV R6, #200     ; 执行的时间为:1*20 个机器周期
D2:MOV R7, #248    ; 该条指令执行了: 1*20*20DJNZ R7,$       ; 该条指令执行了: 2*20*20*248DJNZ R6, D2     ; 该条指令执行了: 2*20*20 个机器周期DJNZ R5, D1     ; 该条指令执行了: 2*20RET             ; 该条指令执行了: 2END

#机器代码和汇编代码的对应关系

每个CPU都有指令集,这个对应关系也就是指令集的对应关系,例如51单片机的指令集是这样的。

指令集

如果我们使用wave来编写汇编代码的话,可以看到汇编代码和机器码的对应关系

汇编对应机器码

我们随便解析一个指令

 CLR P1.4        ; 置0,CLR P1.5        ; 置0,CLR P1.6        ; 置0,

这三条指令是把 对应的GPIO口拉低的,这三条指令对应的机器码是

0009H C294 CLR P1.4
000BH C295 CLR P1.5
000DH C296 CLR P1.6

我们看看指令集里面的C2是干嘛的

CLR bit 直接位清  C2

那后面对应的 94是什么意思呢?看看这个图片就明白了,P1口的基地址是90H,P1.4就是偏移 4位,那就是94H了

外设端口地址

#后续

这篇文章就先讲这么多,还有hex和bin文件的关系,还是有很多东西可以深挖的,后面在讲讲。

我们知道了CPU的机器指令集,可以修改hex让CPU按照我们的想法去工作,听起来还是很酷的。

  推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

CPU怎么认识代码的?相关推荐

  1. 飞腾CPU虚拟化相关代码分析(一)

    飞腾CPU虚拟化相关代码分析(一)-- 函数el2_setup 函数el2_setup是ARM64体系结构下Linux内核运行的第一个和虚拟化相关的函数. 相关概念 ARM64支持两种虚拟方式:Hyp ...

  2. 记 Arthas 实现一次 CPU 排查与代码热更新

    作者 | 何波 [Arthas 官方社区正在举行征文活动,参加即有奖品拿~点击投稿] 1.前言 背景 线上代码经常会出现 CPU 占用过高的情况,按以往经验我会使用 top 指令,进一步借助于 jst ...

  3. ms查约束具体代码_记 Arthas 实现一次 CPU 排查与代码热更新

    简介:线上代码经常会出现 CPU 占用过高的情况,按以往经验我会使用 top 指令,进一步借助于 jstack 去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,及时是一个增量包,应 ...

  4. php cpu缓存 执行 代码,缓存PHP页面的代码,可以减轻CPU和MYSQL负担

    /* * 名称: 极光缓存 * * 作者: DCD * mail: haodan-_-b@163.com * * web开发群: 3574636 * http://www.525ok.com * * ...

  5. php 负载监控_php记录服务器负载、内存、cpu状态的代码

    通过调用系统命令top,然后借助函数explode,实现记录服务器负载.内存使用情况.cpu当前状态等信息. 代码如下: /** * 记录服务器负载.内存使用.cpu状态 * 每10秒检测一次 * e ...

  6. java程序cpu突然飚高_Java 定位导致CPU飙升的代码过程

    线上的一个日志实时输出的程序曾经出过这样一个问题,刚开始上线java程序占用的CPU的资源很少,但是到了整点的时候,CPU直线飙高,直接到达100%根本没有要下降的趋势,唯一的方法只能杀掉它了,后面在 ...

  7. 热更新机制的实现_记 Arthas 实现一次 CPU 排查与代码热更新

    简介:线上代码经常会出现 CPU 占用过高的情况,按以往经验我会使用 top 指令,进一步借助于 jstack 去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,及时是一个增量包,应 ...

  8. linux编译对cpu要求,Linux系统中使用GCC CPU参数优化代码编译

    使用特定的GCC参数可以使编译出的程序执行效率有较大提升.具体如下: 1.优化原理: 在编译程序时,借助参数传递的方法,使用与系统CPU相匹配的gcc参数,编译出的程序就是为系统CPU而进行特定优化过 ...

  9. 浅谈Linux下CPU利用率和CPU负载及其代码实现原理

    编者注: 本来想写个简单的程序测试CPU利用率,后来代码实现后与top(ps)命令测试的结果做对比,疑惑了,疑惑后有了此文-- 第一节   祸起 本来就是想通过写个小程序测试CPU利用率从而可以检验其 ...

最新文章

  1. mfc窗口右下角如何显示一个三角形图案_大型建筑,如何做到室内外设计元素统一?...
  2. UA OPTI544 量子光学7 补充:Density Operator
  3. Kubernetes-ReplicationController(RC)(四)
  4. java连接ftp一直阻塞
  5. ★古今中外著名14大悖论
  6. Scala:数据类型和变量
  7. opencv源码下载编译
  8. 一文详解对称密钥加密
  9. 异形与铁血战士关系 时间线
  10. c# MD5加密
  11. Valve在Game Dev Conference上,OUYA上的1000场比赛等等
  12. JavaScript实现的放大镜放大图片效果
  13. 如何将图片变成GIF图?一键完成gif制作
  14. 利用jsp写输入表单制作简历
  15. 《地理信息系统导论》chapter11矢量数据分析
  16. bootstrap 文字图标 glyphicon class 不显示
  17. OTB100数据集序列分类
  18. 华为od题库汇总分享
  19. 微服务背景下的前后端分离
  20. js实现将canvas保存成图片并下载到本地

热门文章

  1. 函数的二义性与函数对象的传递问题(通过实现vector的to_string示例)
  2. mac地址和ip地址的区别(转)
  3. Socket和ServerSocket
  4. Linux执行命令提示Password,linux expect远程自动登录以及执行命令
  5. gpgga格式读取MATLAB,GPS编码格式及读取.doc
  6. 前端之 BOM 和 DOM
  7. python 消息队列 get是从队首还是队尾取东西_从零开始Python对redis作为消息队列的使用...
  8. java创建对象new后面为啥可以传入参数_你有认真了解过自己的“Java对象”吗?渣男...
  9. JDBC笔记01-JDBC,Connection,Statement,ResultSet,PreparedStatement,Properties
  10. SQL中基于代价的优化