小牛在今天计算机课上,听到老师说了一句话:“同学们,咱们虽然现在用java,c编程很方便,再往前有汇编语音,可再再往前是用机器语言编程啊,把一堆0和1写在纸带上交给计算机去执行,想想都头疼...”
课后,小牛很好奇以前的大佬到底是怎么编程的,可是怎么都想不明白,不得已去找大牛,大牛微微一笑,说:“作为中国人,道德经讲道三生外物,首先我也不了解那么深奥的内容,但从计算机的角度来说,这里的'三',可以说就是‘0 、1、规则’”,小牛听完后有点傻了,大牛继续说道:“先别蒙,就比如现在我让你用0和1表示 加减乘除四种运算,你怎么定义?”,小牛出于潜意识很快的想出:
00 ------ +
01 ------ -
10 ------ *
11 ------ /
规则:00表示+,01表示-,依次类推
写完之后,大牛说道:“不错,我们通过0和1,加上我们自己定义的规则,很轻易的表示了加减乘除四种状态,故生万物,亦易哉”。
小牛恍然大悟,对大牛说:“你说的这些,我有些明白了,也就是说以前用机器语言编程的人,肯定是先有人用0和1制定了一些规则,其他的人只要遵守这些规则就可以了”。
大牛摸了摸小牛的脑袋,“嗯,不错,其实这些规则就叫做指令集,这些指令集是也是被存储起来的,如果规则不同(指令集不同),同一段程序肯定是不能相互理解的,比如我定义加减乘除是01 001 0001 00001,如果你把你的一段加法程序交给我,我的规则里并没有00,所以并不理解你的加法程序”。
小牛点点头,笑道:“这回我是理解了,那我们平时用的高级语言的if之类的语句,是不是也对应着一个‘跳转指令’,不单单是跳转指令,任何一个动作其实都可以用0和1来表示,理论一个指令集可以有很多指令吧,毕竟三生万物”。
大牛道:“别着急,下面我就举一个例子,我给你写一段程序”:
1010101
10010001000100111100101
11000111010001011111110000000001000000000000000000000000
11000111010001011111100000000010000000000000000000000000
100010110100010111111000
10100010111111100
1011101
11000011
........
大牛也是大汗淋漓,终于写完了,对小牛说,“这个程序怎么样?”,小牛满脸问号,“这个是程序?”,
“对啊,你回想我们之前说的规则,这一串0和1有一部分是别人定义的规则,我们叫做CPU指令集,还有一部分是我们操作的数据,也叫作操作数”。
CPU指令集中,有一部分叫做数据传输指令,也就是要把数据运输到某个寄存器当中,比如前两行可以解释为:
1010101(55) ---> push %rbp :
首先rbp入栈, BP寄存器是基址指针寄存器,是专门用来处理函数调用的。那么push %rbp就是将rbp寄存器的内容先保存入栈。
10010001000100111100101(48 89 e5) -- > mov %rsp,%rbp
然后mov %rsp, %rbp,将现在的%rbp的值赋值为和%rsp相等。
其中push move之类的文字,就是汇编语音,相比前面的一堆0和1,汇编语言更直观的阐述了这种规则和数据的关系。
今天小牛仿佛离计算机的世界更近了一步,总结下来,今天跟大牛学了很多:
(1)道德经和牛
(1)设计规则的人很牛
(2)用0和1的人很牛
(3)汇编语言更加直观的翻译了规则
(4)规则也是一段数据,跟程序一样,都要被存储起来