C语言MIPS指令翻译成机器码,计算机指令
在软硬件接口中,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指令翻译成机器码,计算机指令相关推荐
- 四十年前的 6502 CPU 指令翻译成 JS 代码会是怎样
去年折腾的一个东西,之前 blog 里也写过,不过那时边琢磨边写,所以比较杂乱,现在简单完整地讲解一下. 前言 当时看到一本虚拟机相关的书,正好又在想 JS 混淆相关的事,无意中冒出个想法:能不能把某 ...
- c语言的源程序翻译成机器语言的目标,计算机基础知识2.3 源程序是如何被翻译成目标程序的?.ppt...
计算机基础知识2.3 源程序是如何被翻译成目标程序的?.ppt Throughout: CPE, Competitive, Partner, Other? 2.3 编译test.c源程序生成目 标程序 ...
- c语言常用指令翻译,c语言常见专业词汇带翻译
每行每业都有相对的专业英语,那么学习c语言有那么必学的专业英语词汇呢?下面就一起来了解一些必备的c语言专业词汇吧,欢迎大家参阅. c语言专业词汇 identifier 标识符 keyword 关键字 ...
- java翻译后的文件扩展名_Java语言的源程序翻译成字节码之后的扩展名是.______。(填英文,小写)...
影院里一排座位有30个,小明和小红两人去看电影,他们要坐在一起,并且小红坐在小明的左边,一共有______种不同 长方形是轴对称图形.______. 果园里有苹果树56棵,梨树比苹果树多18棵,橘子树 ...
- 语言翻译成汇编语言_编程语言分类
编程语言分类 一.机器语言 只要是谈到计算机基础,有一个东西是我们无法避免的,那就是编程到底是什么?我只放图,其他的你们自己YY. 现在来想象这样一个场景,如果奴隶来自不同的国家,作为尊贵而又穷逼买不 ...
- 如何获取MIPS汇编对应的机器码
在看<自己动手写CPU>的时候,里面需要将MIPS转换成机器码作为输入的指令,不过书上的工具以及一些步骤在实际中是不能用的,因此在这里将"从MIPS汇编转换成机器码"的 ...
- pdf翻译成中文,怎样翻译比较好?
据了解,pdf是一种便携式电子文件,广泛应用于电子图书.产品说明.电子期刊.公司文告.网络宣传.电子邮件等资料处理.随着中外企业的合作加强,pdf文件翻译需求也不断增加.那么,pdf翻译成中文,怎样翻 ...
- 每日分享:Word如何翻译成中文
随着国际化程度的不断提高,我们的工作和生活中越来越多地接触到了各种外语文本.但是,在没有专业翻译人员的情况下,如何快速准确地将英文.法语等语言的文章翻译成中文仍是许多人头疼的问题.这时候,一款方便易用 ...
- 计算机原理与设计-32位MIPS 指令
MIPS指令基础 基本知识 MIPS指令集 指令格式 I型指令 R型指令 J型指令 寄存器与编码 指令详情 算数指令 数据传输指令 逻辑指令 分支指令 跳转指令 MIPS指令翻译示例 斐波那契数列 字 ...
最新文章
- Roadsend PHP-开源的PHP代码编译器
- 锦上添花DataGrid!
- WordPress 网站开发“微信小程序“实战(二)
- Jenkins持续集成环境之凭证管理
- 2018 German Collegiate Programming Contest (GCPC 18)
- java中抽象类 接口_java中的抽象类与接口
- LeetCode 441. 排列硬币(数学解方程)
- 2022年中国政企采购数字化转型白皮书
- [Hive] - Hive参数含义详解
- C++ 的异常处理解答
- 电路的计算机辅助分析实验报告,电力系统计算机辅助分析实验报告.doc
- SAP BAPI 教程 – 在 ABAP 中创建 BAPI 的分步指南-020
- npm install 停在下载某个包的地方不动
- NL驱动表错误导致的性能问题
- 为什么程序员话少钱多死得早?一位人生悲惨的程序员与你讲述其中原因
- 努力学英语——从背单词开始
- Win7任务栏相关设置
- 网络数据请求(unity)
- 不务正业——游记篇 no.1 (重庆)
- 相干光通信基础知识(一)