高级编程语言也要编译成汇编语言,不同的cpu汇编语言不一样,那会编译成那种汇编语言呢?
高级语言一般最终不是编译成汇编语言而是机器语言,而像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 是指令助记符,也就是汇编指令,而用汇编指令编写的程序也是需要编译成机器指令的。
汇编也是编译成机器语言,那为什么汇编语言移植性差,高级语言通用性强?
是啊,机器语言移植性最差,如果你要按移植性排序的话,高级语言>中级语言>低级语言。
其中C/C++语言属于中级语言,汇编和机器语言都属于低级语言,而且指令是一一对应的,一般来说我们将汇编指令等价于机器指令,换句话说汇编指令是方便程序员描述和理解的语言,而机器指令是CPU可以直接执行的语言,它们组成一对人机语言界面,汇编语言比机器语言稍微高半级。与CPU相关性越强,移植性越差。C#这类编译后是公共语言,CPU无法识别的,所以与CPU相关性为0,因此移植性高。同样的代码你在苹果机上用苹果版的VS也能正常编译,因为NET内核知道应该翻译成苹果CPU指令。
针对不同的 CPU、以及不同的操作系统,可选用不同的编译软件。
选对了编译软件,编译出来汇编语言,就是适合你所用的 CPU 和操作系统。