这个问题,挺好的。
先解释一下,CPU的确只认得‘连通(1)’和‘断开(0)’。而所位的机器码却有其物但是他们并不是ASCII码,也不是我们能看到的十六进制数,他们是实实在在的’0‘和’1‘而且也不是存在内存里,而是像一排排开关一样刻在CPU里。按特定的规则打开(0)/关闭(1)这些开关,就会把电路引导到相应的功能。BIOS和内存也不是同一个东西。BIOS是一个写有现成程序的rom芯片买主版的时候直接焊在主板上,内存就是一个数据的大池子原本里面什么都没有。而ASCII码是存在于操作系统中的,操作系统有可以理解为一个大软件,也就是说ASCII码本质上是软件的一部分,既然BIOS里本身就存着ASCII码,那说ASCII码被封装在计算机上也算说得通。至于经过ASCII码转化的控制符都是机器码?这个条件就太多了,虽然在常用系统里,运行反编译工具看到的控制符基本多表示相应的机器码,但是反编译工具本身就是系统里的程序,你能看到那些字母和数字并不代表程序是用字母储存的,他是按照某些约定俗成的规则去翻译内存里的0和1,不然那些内存里的数据读取时没有明确好开头和结尾,只要读偏一位它代表的意思就完全变了。
既然cpu不认得a,b,c那我们看到的汇编程序里的 a b c是哪来的,它们到底是什么东西?难不成是CPU无中生有?没错就是无中生有!我慢慢讲。
你可以想象,你的电子闹钟,你家的智能电饭锅,多功能微波炉,其实都是有集成逻辑电路来操控的,效果和CPU一样,但是为什么不需要你连上键盘鼠标显示器,要手动输入一串串指令才工作,就是因为它内部的工作并不需要被人看到,更不会被人改写。
但是电脑就不一样了,电脑是要与人建立沟通的。人们通过物理结构的区别,给了CPU有两只手,我们规定第一只手抓到的八个0和1就当做是代码,第二之手抓到的八个0和1就是数据,其实两只手抓的东西本质上只是一串串‘1’和‘0’。抓到代码的手就按我前面将的方法CPU自动依照手中代码里的‘0’和‘1’去拨弄开关,最终执行相应的功能,当然功能也包括如何处理另一只手里的数据。
那么人们既然是知道CPU能干什么,可是就目前来看我们要是想和CPU交流的话就只能通过对物理针脚的通电电压高低来控制他。这可能需要每秒钟调整电路几亿次这显然是反人类的。
所以人得想一个简单可行办法让计算机知道我们要CPU干什么。这时候显示器和键盘就有了用处,可是虽然我们都知道CPU看的是0和1,并且我们也能用人类的符号‘a,b,C,0,3,5’在纸上把他们写出来,但该如何把它用显示器显示出来呢?
ASCII码登场了,之所以有ASCII码就是为了能让机器与人交互就像一本字典,每个ASCII码具有几个不同的意义,就拿A来说,对于cpu来说就是‘0100 0001’,对于显示器来说就是:
对于人来说代表的就是抽象的英文字母“A”。
当我们看到字符在屏幕里显示的时候就是:人们用十六位机器码写程序>>>通过键盘输入给电脑,此时你以为你输入的是a,b,c,d其实键盘给电脑传过去的是0和1>>> cpu通过指令再把0和1复制一份,一份自己留着用当成指令,另一份拿出机器二进制码和人们编好的汇编指令表对比,得到汇编指令各个字母对应的ASCII码>>>将转化成上面图片里的点阵>>>显示在屏幕上。
其实从始至终cpu都没去理解ASCII码里面的字母到底是什么意思。
到这里可能还有疑问,就是既然cpu的指令多可以用ASCII换成字符来表示,那是不是能通过ASCII码转化来的像命令的东西都有对应的机器指令。显然不是的,机器指令的数量肯定比字母与数字的组合少得多。我们不能谁便拿来一串数据,就用ASCII码,一个一个匹配,看看那些是能翻译的,这样做是没道理的。即便要对比也是先把二进制换算与之相应的汇编指令的ASCII码才可能行。
如果你直接用ASCII表翻译就会得到以下结果:
内存里是100 1000 1000 1011 0101 0101 1111 1000
你用ASCII码比较出来的是'H U '
他正真汇编指令的意义是:mov rdx,[rbp-08]
而‘H U ’和mov rdx,[rbp-08]并没有直观的联系。
到这里基本已经非常浅显的区别讲了一下。
至于都有什么机器码,如果英文好的话可以自行去cpu的官网去查》
https://software.intel.com/conte ... cles/intel-sdm.html
这个是Intel的。
其实东西并不复杂,只不过刚接触这些摸不到,看不着又抽象的东西,的确会想的很头疼