高级编程语言也要编译成汇编语言,不同的cpu汇编语言不一样,那会编译成那种汇编语言呢?

高级编程语言通用性强,但是用程序员编译好的软件,不需要重新编译就可以用,我和程序员的cpu可能不一样。这是什么原因呢?

第1个回答  2020-07-30
不同架构的CPU拥有不同的指令集,汇编机制也不相同。底层原理比较复杂,可以网上查阅汇编语言、CPU相关资料进行了解。
第2个回答  2020-07-30

高级语言一般最终不是编译成汇编语言而是机器语言,而像C#这类语言编译后为公共语言,不是机器码,运行时公共语言代码由NET框架负责进一步即时翻译即时执行为机器指令。只有C++这类语言编译后为CPU可以直接执行的机器码。


附图是VS2019中C++语言的一段调试时的反汇编窗口,其中白字是C++源代码,下面是对应的汇编码,汇编行左列为内存地址,中间是对应的机器指令和数据(内存中的实际值),右侧是对应的汇编码。

比如,定义整数变量a并赋值1的语句,被编译器编译成C7 45 F8 01 00 00 00 这样几个字节,其中C7为汇编码中的MOV指令,可以操作16位寄存器和内存以及立即数,45 F8 是当前命名空间中变量地址,即变量a的地址(F845),而01 00 00 00 为32位宽度的数值1(内存排列顺序是前低后高)。也就是说机器语言的指令格式为:指令代码,地址,数据,当然根据不同指令,有时候地址和数据是不需要的。而右侧 MOV  dword ptr[a],1 是指令助记符,也就是汇编指令,而用汇编指令编写的程序也是需要编译成机器指令的。


指令C7对应的汇编码及含义

追问

汇编也是编译成机器语言,那为什么汇编语言移植性差,高级语言通用性强?

追答

是啊,机器语言移植性最差,如果你要按移植性排序的话,高级语言>中级语言>低级语言。
其中C/C++语言属于中级语言,汇编和机器语言都属于低级语言,而且指令是一一对应的,一般来说我们将汇编指令等价于机器指令,换句话说汇编指令是方便程序员描述和理解的语言,而机器指令是CPU可以直接执行的语言,它们组成一对人机语言界面,汇编语言比机器语言稍微高半级。与CPU相关性越强,移植性越差。C#这类编译后是公共语言,CPU无法识别的,所以与CPU相关性为0,因此移植性高。同样的代码你在苹果机上用苹果版的VS也能正常编译,因为NET内核知道应该翻译成苹果CPU指令。

追问

我在window电脑上下载了一个软件,没有重新编译打开就直接可以运行,不同的电脑cpu不一样,为什么也能正常运行?

追答

已经编译好了啊,相同CPU指令系统一样的啊,移植性指的是不同指令集。比如intel cpu 和苹果CPU

追问

不可能每个人的电脑cpu都一样吧?

追答

pc机都一样,百度下指令集,谢谢。

本回答被提问者和网友采纳
第3个回答  2020-08-09

针对不同的 CPU、以及不同的操作系统,可选用不同的编译软件

选对了编译软件,编译出来汇编语言,就是适合你所用的 CPU 和操作系统。

相似回答