“机器码”和“计算机指令”到底是怎么回事?
软硬件接口,CPU做了些什么?
从硬件角度讲,CPU就是超大的集成电路,通过电路实现加法、乘法或者其他逻辑
从软件角度讲,CPU就是执行指令的机器,指令可以理解成机器能看懂的语言。
不同的CPU,听懂的语言也不太一样,是不同的计算机指令集。其实也是认为定义的而不同。
现在的mac m1 能执行手机系统ios上的app,也是应为他俩的指令集相同,可以理解成都是说英语的,能交流上。
一般的程序,有成千上万个指令,一般都是存储在存储器里面的,需要执行的时候再取出来放进CPU里计算,这种称为存储程序型计算机。
编译到汇编,代码怎么变成机器码的?
以上c语言编译成汇编语言,再由汇编语言翻译成机器码,也就是0和1的机器语言。一条条的16进制数字,就是机器能读懂的计算机指令
linux系统上可以使用gcc和objdump,把汇编码和机器码都打印出来。
汇编代码和机器码是一一对应的,一条汇编对应一条机器码。
有汇编代码主要是未来方便人看,要不然都是0110的数字,谁也看不懂啊,汇编代码可以说是给“程序员看的机器码”。
指令和机器码的分类
我们来了解一下指令和机器码,到底是什么意思呢?一般来说指令分为5类:
- 算数类指令。加减乘除
- rgba(46,29,92,.6)数据传输类指令。变量赋值、在内存里读写数据
- 逻辑类指令。是与非
- 条件分类指令。if/else
- 无条件跳转指令。一般指函数,闭包之类的,直接跳转内存地址
汇编代码怎么转换成机器码的?
我们简单实用MIPS指令集来看一看,MIPS的指令是一个32位的整数,高6位叫**操作码,**代表这条指令具体是一条什么样的指令,剩下26位对应R、I、J三种格式。
- R指令,一般是算术逻辑操作,里面有读取和写入数据寄存器的地址。如果是逻辑位移的操作,还有位移量,最后的功能码,是在操作码不够用来扩展的。
- rs寄存器,rt寄存器,rd存放结果的目的寄存器,shamt是位移量,funct是前面操作码不够的补充。
- I指令,通常是数据传输、条件分支,以及运算时候不是变量,而是常数的时候。没有位移量,没有操作码,也没有寄存器,三个部分直接合并成地址或一个常数
- rs寄存器,rt存放操作结果的寄存器,是个常数
- J指令,是一个跳转指令,26位都是一个跳转的地址
举个🌰:
add $t0,$s2,$s1
add这里是一个计算逻辑,是R指令,rs是寄存器17,rt是寄存器18,rd是存放结果的寄存器8,无偏移量,功能码是32代表加法。把十进制转换成二进制就好吗
附:
汇编指令
开头的是表示寄存器
PC:Project Count 程序计数器
Memeory[num]: 表示内存地址的位置,num表示的是字节,并非字。
指令的参数
reg表示寄存器(0~31),
address表示16位地址
n. a. (not applicable)表示这个字段在该指令格式中不出现
这里也可以看出,add,sub的区分是依靠funct功能字段的。