在软硬件接口中,CPU帮我们做了什么?

从硬件角度来看, CPU就是一个超大规模集成电路,通过电路实现了加法,乘法乃至各种各样的处理逻辑。

从软加工程师的角度来讲,CPU就是一个执行各种计算机指令(Instruction Code)的逻辑机器。这里的计算机指令,就好比一门CPU能够听懂的语言,我们把它叫做机器语言(Machine Language)

不同的CPU能够听懂的语言不太一样。比如我们个人电脑用的Intel的CPU,苹果手机用的是ARM的CPU。类似这样两种CPU各自支持的语言,就是两组不同的计算机指令集(Instruction set)

一个计算机程序,不可能只有一条指令,而是由成千上万条指令组成的。但是CPU里不能一直放着所有指令,所以计算机程序平时是存储在存储器中的。这种指令存储在存储器里面的计算机,我们就叫做存储程序型计算机

从编译到汇编,代码怎么变成机器码?

//test.c

intmain()

{int a = 1;int b = 2;

a= a +b;

}

要让这段程序在一个Linux操作系统上跑起来,我们需要把整个程序翻译成一个汇编语言(ASM,Assembly Language)的程序,这个过程我们一般叫编译(Compile)成好汇编代码。

针对汇编代码,我们可以再用汇编器(Assembler)翻译成机器码(Machine Code)。这些机器码由“0”和“1”组成的机器语言表示。这一条条机器码,就是一条条的计算机指令。这样一串串的16进制数字,就是我们CPU能够真正认识的计算机指令

在一个Linux操作系统上,我们可以简单地使用gcc和objdump这样两条命令,把对应的汇编代码和机器码都打印出来。

[learning_log@localhost 桌面]$ gcc -g -c text.c

[learning_log@localhost 桌面]$ objdump-d -M intel -S text.o

text.o: 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 :intmain()

{0: 55push rbp1: 48 89e5 mov rbp,rspint a = 1;4: c7 45 fc 01 00 00 00 mov DWORD PTR [rbp-0x4],0x1

int b = 2;

b: c745 f8 02 00 00 00 mov DWORD PTR [rbp-0x8],0x2a= a +b;12: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8]15: 01 45 fc add DWORD PTR [rbp-0x4],eax

}18: 5d pop rbp19: c3 ret

可以看到左侧一堆数字,这些就是一条条机器码;右边有一系列的push、mov、add、pop等,这些就是对应的汇编代码。一行C语言代码,有时候对应一条机器码和汇编代码,有时候则是对应两条机器码和汇编代码。汇编代码和机器码之间是一一对应的。

从高级语言到汇编代码,再到机器码,就是一个日常开发程序,最终变成了CPU可以执行的计算机指令的过程。

解析指令和机器码

常见的指令可以分为五大类。

第一类是算术类指令。我们的加减乘除,在CPU层面,都会变成一条条算术类指令。

第二类是数据传输类指令。给变量赋值,在内存里读写数据,用的都是数据传输类指令。

第三类是逻辑类指令。逻辑上的与或非,都是这一类指令。

第四类是条件分支类指令。日常我们写的“if/else”,其实都是条件分支类指令。

最后一类是无条件跳转指令。写一些大一点的程序,我们常常需要写一些函数或者方法。再调用函数的时候,其实就是发起了一个无条件跳转指令。

我们说过,不同的CPU有不同的指令集,也就对应着不同的汇编语言和不同的机器码。为了方便你快速理解这个机器码的计算方式,我们选用最简单的MIPS指令集,来看机器码是如何生成的。

MIPS的指令是一个32位的整数,高6位叫操作码(Opcode),也就是代表这条指令具体是一条什么样的指令,剩下的26位有三种格式,分别是R、I、J。

R指令是一般用来做算术和逻辑操作,里面有读取和写入数据的寄存器的地址。如果是逻辑位移操作,后面还有位移操作的位移量,而最后的功能码,则是在前面的操作码不够的时候,扩展操作码表示对应的具体指令的。

I指令,则通常是用来数据传输,条件分支,以及在运算的时候使用的并非变量还是常数的时候。这个时候,没有了位移量和操作码,也没有了第三个寄存器,而是把这三部分直接合并成一个地址值或者常数。

J指令就是一个跳转指令,高6位之外的26位都是一个跳转后的地址。

add $t0,$s2,$s1

对应的MIPS指令里的opcode是0,rs代表第一个寄存器s1的地址是17,rt代表第二个寄存器s2的地址是18,rd代表目标的临时寄存器t0的地址,是8。因为不是位移操作,所以位移量是0.把这些数字拼在一起,就变成了一个MIPS的加法指令。

为了读起来方便,我们一般把对应的二进制数,用16进制表示,也就是0X02324020。这个数字也就是这条指令对应的机器码。

如果想要对日常使用的Intel CPU的指令集有所了解,可以参看《计算机组成与设计:软/硬件借口》第5版的2.17小节。

C语言MIPS指令翻译成机器码,计算机指令相关推荐

  1. 四十年前的 6502 CPU 指令翻译成 JS 代码会是怎样

    去年折腾的一个东西,之前 blog 里也写过,不过那时边琢磨边写,所以比较杂乱,现在简单完整地讲解一下. 前言 当时看到一本虚拟机相关的书,正好又在想 JS 混淆相关的事,无意中冒出个想法:能不能把某 ...

  2. c语言的源程序翻译成机器语言的目标,计算机基础知识2.3 源程序是如何被翻译成目标程序的?.ppt...

    计算机基础知识2.3 源程序是如何被翻译成目标程序的?.ppt Throughout: CPE, Competitive, Partner, Other? 2.3 编译test.c源程序生成目 标程序 ...

  3. c语言常用指令翻译,c语言常见专业词汇带翻译

    每行每业都有相对的专业英语,那么学习c语言有那么必学的专业英语词汇呢?下面就一起来了解一些必备的c语言专业词汇吧,欢迎大家参阅. c语言专业词汇 identifier 标识符 keyword 关键字 ...

  4. java翻译后的文件扩展名_Java语言的源程序翻译成字节码之后的扩展名是.______。(填英文,小写)...

    影院里一排座位有30个,小明和小红两人去看电影,他们要坐在一起,并且小红坐在小明的左边,一共有______种不同 长方形是轴对称图形.______. 果园里有苹果树56棵,梨树比苹果树多18棵,橘子树 ...

  5. 语言翻译成汇编语言_编程语言分类

    编程语言分类 一.机器语言 只要是谈到计算机基础,有一个东西是我们无法避免的,那就是编程到底是什么?我只放图,其他的你们自己YY. 现在来想象这样一个场景,如果奴隶来自不同的国家,作为尊贵而又穷逼买不 ...

  6. 如何获取MIPS汇编对应的机器码

    在看<自己动手写CPU>的时候,里面需要将MIPS转换成机器码作为输入的指令,不过书上的工具以及一些步骤在实际中是不能用的,因此在这里将"从MIPS汇编转换成机器码"的 ...

  7. pdf翻译成中文,怎样翻译比较好?

    据了解,pdf是一种便携式电子文件,广泛应用于电子图书.产品说明.电子期刊.公司文告.网络宣传.电子邮件等资料处理.随着中外企业的合作加强,pdf文件翻译需求也不断增加.那么,pdf翻译成中文,怎样翻 ...

  8. 每日分享:Word如何翻译成中文

    随着国际化程度的不断提高,我们的工作和生活中越来越多地接触到了各种外语文本.但是,在没有专业翻译人员的情况下,如何快速准确地将英文.法语等语言的文章翻译成中文仍是许多人头疼的问题.这时候,一款方便易用 ...

  9. 计算机原理与设计-32位MIPS 指令

    MIPS指令基础 基本知识 MIPS指令集 指令格式 I型指令 R型指令 J型指令 寄存器与编码 指令详情 算数指令 数据传输指令 逻辑指令 分支指令 跳转指令 MIPS指令翻译示例 斐波那契数列 字 ...

最新文章

  1. Roadsend PHP-开源的PHP代码编译器
  2. 锦上添花DataGrid!
  3. WordPress 网站开发“微信小程序“实战(二)
  4. Jenkins持续集成环境之凭证管理
  5. 2018 German Collegiate Programming Contest (GCPC 18)
  6. java中抽象类 接口_java中的抽象类与接口
  7. LeetCode 441. 排列硬币(数学解方程)
  8. 2022年中国政企采购数字化转型白皮书
  9. [Hive] - Hive参数含义详解
  10. C++ 的异常处理解答
  11. 电路的计算机辅助分析实验报告,电力系统计算机辅助分析实验报告.doc
  12. SAP BAPI 教程 – 在 ABAP 中创建 BAPI 的分步指南-020
  13. npm install 停在下载某个包的地方不动
  14. NL驱动表错误导致的性能问题
  15. 为什么程序员话少钱多死得早?一位人生悲惨的程序员与你讲述其中原因
  16. 努力学英语——从背单词开始
  17. Win7任务栏相关设置
  18. 网络数据请求(unity)
  19. 不务正业——游记篇 no.1 (重庆)
  20. 相干光通信基础知识(一)

热门文章

  1. 思维导图-理清发展思路
  2. C#WindowsMediaPlayer的播放列表
  3. Visual Studio 光标位置变成了闪烁的黑色方块
  4. 搭载网站的云服务器需要空间备案,云服务器需要备案么
  5. 推荐一款桌面管理神器
  6. 2017中国西部国际制冷空调供热通风及食品冷冻加工展览会(西部制冷展)会刊(参展商名录)
  7. 【自制操作系统06】终于开始用 C 语言了,第一行内核代码!
  8. 使用林地可行性报告现状图要包含的内容清单
  9. [转]SaaS风暴:中国软件企业如何应对挑战?
  10. 毛衣大战,殃及池鱼,亡羊补牢,尚可一试。