① 机器码、CPU指令集、汇编指令集、操作系统、API接口、C标准库的关系。
你好,我来初步解释你所提的问题,仅供参考。
1、不同的CPU肯定对应不同的机器码,其实这种说法不规范,应该是不同的机器码集,或机器指令集,因为汇编指令和机器指令是一一对应的,也可以说成是汇编指令集。我们编写的程序最后都是处理(这里的处理根据不同的高级语言,可能是解释、预编译、编译、链接等等)成由汇编指令集里面的指令构成的指令序列,然后调入内存,再一条条由知道这每条指令干什么用的CPU来执行的。
你说的“+”号,其实就是加法指令,当然不可能是“010101”,因为没有6位的指令,只可能是4位、8位、16位、32位、64位。
位数相同不同型号的CPU,指令集略有不同的,但绝大多数指令应该是相同的。比如类似你说的“+”等算术运算,当然还有更多的其它指令,都是相同的二进制编码。这就是你的同一台电脑可以使用INTEL的CPU,也可以使用AMD的CPU的原因,并不会因为你换了CPU,电脑就不能运行了。
那么32位的CPU还能执行16位的指令吗?那么64位的CPU还能执行32位、16位的指令吗?这就看CPU是否向下兼容了。如果你的程序(exe文件)很老,一运行就出错,或者蓝屏了,呵呵,就不兼容了。CPU不再认识你的程序里的那些“老”指令了。
2、这个问题在回答1里已经说的很清楚了,机器码就是CPU的指令,CPU的指令集就是机器码的集合,说白了,就是CPU的API(应用程序编程接口),只不过这里的应用指的是汇编语言。
3、和2是同一个问题,汇编指令集当然和CPU指令集是一一对应的。一种新的CPU生产出来后,它的指令集就是固定的。生产厂家就会推出对应的新的汇编系统,与其指令集相配套。然后那些编译系统开发商们也会对他们的系统进行升级,增加新的特性。
4、C标准库也是机器指令构成的程序,当然和CPU指令集有关系。所谓的标准,不是针对机器语言来说的,而是针对C语言的编码来说的。比如sin(x);这个函数,在不同的电脑(PC机、苹果机甚至手机、单片机等),用C语言编写代码时,都是sin(x),不会是别的(比如sn(x))。诸如此类的所有函数形成的集合就是一个标准库。所以我们编写的标准C程序,可以再PC机上编译成PC机能运行的机器指令,也可以再苹果机上编译成苹果机能运行的机器指令,PC机上有PC机的"翻译",苹果机上有苹果机的“翻译”,他们将这个你编写的这个相同的C程序翻译成不同的机器指令,但最终程序的运行结果是一样的。这就是可移植性,因为遵循了标准。标准不光指的标准库,还包括数据类型、关键字、运算符、语法等。标准库的实现当然和你所使用的计算机的CPU的指令集是紧密相关的。C的编译器的实现可以是机器语言、汇编语言,也可以是C语言实现。呵呵,这个好像不太好理解。所谓的编译,就是将你的由字符构成的源程序转化成机器能理解的二进制,二进制无非是0、1构成的一串符号,先存在硬盘,再调入内存运行。机器语言、汇编语言、C语言都能处理二进制,都能生成那个最终的二进制文件,明白了吧。
C库函数和windows api基本没有关系。windows有自己的一套库函数,就是API,事实上,C的标准库已经没有多大意义了。如果我们编写没有图形界面的某些应用程序,如控制台应用程序,可能还会用到标准库。
5、windows如果不知道CPU的指令集,如何发挥windows的最佳效率?而汇编语言、C语言和CPU联系的最紧密,当然要用它们来写。
所谓封装,就是隐藏其实现,暴露其接口。正如CPU一样,我们知道ADD A,B是计算A加B,怎么计算的,不用知道。CPU指令集就是这台裸机(无操作系统)给我们的一个API。
一台安装了windows系统的计算机,其实是一台建立在裸机基础上的“虚拟机”。这就好比一个初生儿和一个成人一样,初生儿其实具备了一个人的所有特征,但你无法和他交流(即使是机器语言也不行,呵呵),但他的确什么都会,你能说一个初生儿不会说英语吗,他会的,他已经具备了说英语的所有条件,因为他有嘴巴、会发音,有嘴巴就会说。但是让初生儿说英语实在是太难了,也就是这个API不好弄。一个成人就是安装了操作系统的长大了的初生儿,他的功能更多了。比如肌肉发达了(相当于外设增加了),能很看懂英语和说英语了(高级语言有了)。但最终还是要和初生儿一样用嘴巴说英语!只不过说的更好听而已,也就是API更丰富罢了。但不论你吃的是什么山珍海味,还是五谷杂粮,最终都转换成氨基酸、葡萄糖、微量元素和水供肠胃吸收。不论你用什么语言编写的程序,最终都是CPU执行的二进制机器指令。
API本质上一个windows系统调用的集合,调用windows给我们提供的所有功能,比如创建一个窗口。如果windows没有提供这个集合,那么windows还有用吗?至于windows是怎么提供这个API的,API是怎么实现的,这个就要问microsoft了。
② 可以由汇编程序翻译成对应的机器码的指令是伪代码吗
伪代码:一般我们写的程序代码都是伪悉汪代码由编译器转化成对应的机器码的指令,才可以被及其执行。
segment 和ends是一对承兑使用的伪指令,这是可搏陆培被汇编编译的指令
codesg segment ;这个段从这里开始
codesg ends ;这个段这里介绍
注codesg是段名
end是汇编程序的结束标记,编译器在编译汇编程序的过程中,碰到伪指令end就表示程序结束了
注: end和ends是两个指令 ends与 segment对应
assume: 这个指令时假设的意思寄存器和程序中某一段相关基唯联,通过assume说明这种关联