‘壹’ 编译器为什么会生成汇编语言而不是机器语言
计算机只能识别二进制代码,所以机器指令是由二进制代码组成的,即你所说的机器语言。所谓汇编语言,只是一种符号,用来方便人们使用,否则你看到的都是一串串的01011011之类的信息,一眼就认出它是什么指令非常困难,而用汇编语言这种符号,一看就知道是什么指令了。这种符号语言用助记符来表示操作码,用符号或符号地址来表示操作数或数地址,它与机器指令是一一对应的。(楼上各位表述的所谓“步骤”论是不确切的)
所以,并不是你说的“生成汇编语言而不是机器语言”,生成的是机器语言,你在调试器或反汇编程序中看到的汇编语言代码只是由反汇编程序把机器指令翻译成你看得懂的符号--汇编语言--而已。(比如你在OD或IDA中可以看到每行汇编指令前面都有机器码,如push ebp的机器码是55h,单看55,你不是熟手的话可能还不知道它是什么指令,后面给你显示出符号"push ebp",你一下子就明白了,这就是一一对应的关系,连"55"都是为了让你看的方便,否则应是01010101,即8个电子元件的电源开、关状态)
同样的道理,你在十六进制编辑器(如winhex、HexWorkShop等软件)中看到的是十六进制每行16字节排列的,那也是经过把二进制代码每字节转换成十六进制显示给你看的。
关于平台问题,当然会有影响,不同的CPU有不同的指令系统,就连同一厂家的CPU指令系统都不同,比如Intel公司的CPU,从最早的到现在的,指令不断增多,什么MMX、SSE等等新指令集不断出现,更不要说不同厂家的CPU了。当然它们之间也有很多兼容的指令集。
‘贰’ 关于汇编和c语言效率哪个高
这个不一定,取决于编程人员的水平,
实现相同功能:
一般来说,如果牛人来写汇编和C语言,肯定汇编性能高。
但如果一般开发人员写汇编和C语言,就不一定了,
因为现代编译器有大量的优化手段(超牛人写的,比如寄存器优化,乱序优化,字节对齐优化等等,很多优化技术一般开发人员是不了解的),这些优化手段最终得到的效果,可能比一般人直接用汇编写的性能更高。
‘叁’ 正常编写的c语言程序编译器会自动进行针对特定指令集用汇编语言优化吗
这个要看你使用什么编译器了。查看编译器的帮助文档,它会告诉你它支持那些指令集,并且做哪些可能的优化。
不同的编译器,是不一样的。
补充:GCC 不太清楚,你连VC++的版本都不说。汗,VC6是不支持SSE的,需要安装VC6SP5。
VS2005 和 VS2008 都支持 SSE。对 SSE/MMX 指令集优化得最好的,还是 Intel 的 c++ 编译器。
对并行和高性能计算,Fortran 的优势比较大。特别是 Fortran2003 的新特征,为并行计算做了很多专门的设定。Intel 也有 Fortran 的编译器。
‘肆’ 同样需要编译器为什么汇编语言比较快
绝大多数情况下,并不是。
事实上除了对CPU工作模式极端熟悉的人,一般人是很难用汇编写出更高效的代码的。
编译器虽然智商比不了人,但是它更精通优化。生成高效的代码需要透彻地掌握硬件的工作模式,每个细节都要考虑清楚。而且这很大程度上是软件更擅长但人并不擅长的繁重无脑又要求极高精确性的机械化工作。
当然专业搞优化的人还是能打败编译器的,因为编译器能做到的人终究还是可以做到。而人要比编译器聪明得多。编译器只能遵循一些规定好的模式进行优化,人可以创造编译器根本不知道的优化方法。某些逻辑靠编译器是没办法生成出来的,只能由人直接用汇编写。汇编语言虽然也要编译,但是一般会和机器指令直接对应,相当于要求CPU在细节上严格按人的思路工作,而高级语言并不能控制太多细节。
‘伍’ 用c语言写程序时,还可以用汇编语言吗
可以像楼上一样用特定编译器支持的asm、__asm一类关键字内嵌汇编,也可以让编译器编译时输出汇编代码,然后再在上面进行改动,最后一并转成机器码。要用哪种方法还是看需要而定,如果是实现一个特定模块,可以内嵌;如果是要做代码调整,用后一种。
不过话说回来,在现代编译器把优化已经做得很好的情况下,用C这么底层的语言已经很少用得到汇编了。
‘陆’ 汇编语言在当今的应用性是否可以被C语言完全取代
1.语言很难被取代的,使用哪种语言是要看环境的,像设计硬件的或者对效率要求高的话,你必然还是会选汇编,如果对移植比较重视,必然选C,汇编毕竟局限性很大,至于学不学看你自己,个人建议学,你不可能停留在应用层的开发,总要深入平台的,而汇编无疑是把厉剑
2.学汇编和学别的语言没什么大的语言,耐心很重要,兴趣要培养,多思多练,不要被书禁锢了思想,学前可以了解下你所要工作的平台硬件相关的信息,一般都是linux操作系统和ARM所以在学期,不妨花点时间了解下硬件和系统的基本知识
‘柒’ 汇编语言有什么特点
1、机器相关性
这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。
2、高速度和高效率
汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快,是高效的程序设计语言。
3、编写和调试的复杂性
由于是直接控制硬件,且简单的任务也需要很多汇编语言语句,因此在进行程序设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬件资源。这样,就不可避免地加重了程序员的负担。与此相同,在程序调试时,一旦程序的运行出了问题,就很难发现。
(7)汇编语言能被编译器优化吗扩展阅读
汇编语言的发展历程:
说到汇编语言的产生,首先要讲一下机器语言。机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。
上面所说的计算机指的是可以执行机器指令,进行运算的机器。这是早期计算机的概念。在我们常用的PC机中,有一个芯片来完成上面所说的计算机的功能。这个芯片就是我们常说的CPU(Central Processing Unit,中央处理单元)。
每一种微处理器,由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。
早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。这样的机器语言由纯粹的0和1构成,十分复杂,不方便阅读和修改,也容易产生错误。
程序员们很快就发现了使用机器语言带来的麻烦,它们难于辨别和记忆,给整个产业的发展带来了障碍,于是汇编语言产生了。