前言:
很久很久以前,由于那时的计算机不具备识别高级语言的能力,因此人们通过往纸带上打孔的方式编程,然后再将纸带交给计算机去读取执行,此时纸带固定位置上是否打孔就表示二进制的1与0.
一、软硬件接口中的CPU
我们都知道在硬件层面CPU是超大规模集成电路,用意实现加法、乘法这样的算数运算和其他很多类型的逻辑运算;而在软件工程师看来,CPU被用于执行各种各样我们称之为机器语言的计算机指令,因此CPU型号和厂商不同,它们所能执行的指令也不尽相同;此外CPU只是执行程序的设备,它并不具备存储程序的功能,因此我们所谓存储程序型的计算机是借助存储器来存储查询,运行时由CPU读取执行。
二、编译&汇编,将我们的代码编程机器码
一般我们使用C、java这样的高级语言编程,这些语言写出的代码不能被CPU直接执行,因此需要通过编译器将它们编译汇编代码,再将汇编代码翻译为机器码,最后交给CPU执行,注意!汇编语言的报纸上还是机器码,只不过我们将二进制的机器指令转用一些英文助记符表示了而已,看到没有由于高级语言会最终编译为机器指令,而机器指令的多少直接决定CPU的执行时间,所以有一个牛逼闪闪的编译器相当重要。
下面是一个编译案例,左侧为C代码与机器码,右侧为对应汇编代码,可以看到C代码行有可能编译为一行多行机器码:
test.o: file format elf64-x86-64 Disassembly of section .text: 0000000000000000 <main>: int main() { 0: 55 push rbp 1: 48 89 e5 mov rbp,rsp int a = 1; 4: c7 45 fc 01 00 00 00 mov DWORD PTR [rbp-0x4],0x1 int b = 2; b: c7 45 f8 02 00 00 00 mov DWORD PTR [rbp-0x8],0x2 a = 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 rbp 19: c3 ret
C代码 --->汇编代码--->机器码
三、汇编与指令
常见五种指令:
MIPS指令集:
MIPS公司于上世纪八十年代开发出的MIPS指令集,目前已经开源,它的每条指令由32位二进制数组成,高6位表示操作码,其余26位分为三种,图示如下:
以这条指令为例:
add $t0,$s2,$s1
其对应机器码如下:
最终将这个二进制指令以打孔纸带的形式表示即可
四、扩展:编译型语言与解释型语言
C这种语言通过直接将源代码编译成机器码的方式执行,所以又称为动态语言,而Python是在程序运行时逐行有Python解释器解释执行,此外Java是通过将源代码转为中间代码然后在虚拟机上解释执行,对于一些热点代码也可以直接编译为机器码去执行,属于解释-编译混合方式执行的。
原文:https://www.cnblogs.com/rxmind/p/12780596.html