A. 每个编译器都不一样么 c语言一般用什么编译器 每次一种编译器不能编译 另一种却能编译出
编译器就是c语言编译成二进制的东西,
不同的编译器是不同的, 比如16位系统和32位系统的编译器就不同,因为16位的认为int是2字节,32位的则认为是4个字节。 另外 linux上的编译器跟windows下的编译器也不同,linux上的认为内核空间占1G,而windows下则认为占2G, 此外两个系统对环境变量以及其他的设置也不同所以编译器更不能用。
而且不同的CPU的指令集时不同的,所以同样int a =1 最后被编译成的二进制代码也是不同的。
C语言的编译器有很多,windows下的编译器也有很多,不同的编译器可能会做一些不同的优化,linux下的gcc也可以添加选项让他编译windows下运行的程序。
main(int argc,char*argv[ 】 ) argc 是你的参数个数 argv是你的参数。
比如你最终程序叫 add 那么 你在命令行执行add 1 2 那么argc =3 第一个参数使你的add, 第二个第三个就是 1 2, 在函数内部你就可以获取这俩参数进行相加然后打印
visual 是个IDE,集成开发环境,已经集成好了windows下使用的编译器连接器 等, 编写代码完成后直接点击编译就行了。 IDE的默认编译器是可以更改的,不同的IDE设置不同。
B. C语言为什么要先编译成汇编语言
C语言,具有可移植性,或者说同样的代码可以在不同cpu平台上运行得到同样的结果
汇编语言,移植性差,一般针对某型cpu,每个类型的cpu都有自己的汇编语言
为保证C语言编制的通用算法的可移植性,比如我们用C编写了一套mp3解码算法程序,要在pc机上、手机上都能用,那么我们就采用通用的C编译器,将C语言程序编译成指定CPU的汇编语言,再汇编成机器可执行程序。
另一个用途是程序优化问题,在C语言层次,由于是高级语言,不涉及底层硬件,那么底层硬件的特性不能够得到充分利用,在需要优化算法的场合,我们需要将C语言算法编译生成汇编程序,然后修改需要优化的汇编程序达到目的。比如,你在手机上经常会遇到音频解码器,需要安装,而且不同的cpu需要选择不同的解码器,这些解码器应当就是在汇编层次上优化了算法的可执行代码,关键部分经过汇编级优化,不需要优化部分仍然使用C语言编译的结果。
C. 不同的CPU,汇编语言也不同
如果楼主只是针对一个系统(比如说微机系统)用汇编语言编程的话,其实基本不用考虑兼容性的问题
现在的CPU基本是INTEL的天下了,另外的一个能和INTEL较劲的CPU生产商AMD的CPU指令和INTEL也是基本兼容的,用汇编编程的时候注意一下就好了,那些不同CPU之间有出入的指令坚决不用,所以我说兼容性基本可以不用考虑
另外个人认为关于指令系统在以后必定会出现一个规范,以用于规范这些乱麻似的各种指令系统,就像IEEE,W3C等等.当然,也可能已经有了,这个我不太清楚
另外关于不同类型的CPU之间的源程序不能通用的问题个人认为有点像放屁.
拿单片机和微机的CPU举例,这两种CPU虽然都可以用C语言写,但其实它们的编译器是不一样的(这个我不太确定),更重要的是单片机和微机的硬件是完全不一样的,有时输入系统可能就是一个电键,所以你甚至不能输入一个字符.在这种情况下,你如果通过汇编来学习单片机,其实会更简单,也会学的更深刻
最后需要强调的是,汇编语言重要的不是指令,而是编程思想,技巧和对各种硬件的控制,在真正需要汇编的地方其实不需要太大的编码量(一般只在一些特别需要速度的地方嵌入汇编,其他地方还是用高级语言),所以就更不需要考虑兼容性了,反正就那么一点,大不了重写呗
最最后,我要说的是:
其实汇编不是用来写程序的 - -
现在的CPU越来越快了,各种硬件也越来越牛,所以很多时候已经不需要用汇编来优化了.再说了,如果一个游戏或程序因为没有优化而运行的不是很好的话,会刺激使用者去购买更高级的硬件,这样会刺激硬件制造商生产更牛的硬件,这个虽然会使电脑使用者倒霉,但对计算机的未来还是有好处的(这个是在罗云彬的书里看到的,intel和微软就是用的这种方式)
【汇编是用来更深刻地理解其他高级语言的】
高级语言的某些知识如果通过汇编来思考的话,会很容易理解,你甚至可以把汇编当成是理解高级语言的工具,而且这个工具非常的牛
===========================================================
好了,以上就是我的观点,可能会有一点偏激和若干错误,希望对楼主能有点用
D. 64浣岰PU锛氲繍绠楅熷害椋椤崌锛屽诲潃鑳藉姏椋炶穬
64浣岰PU鏄涓绉嶆ц兘鍗撹秺镄勫勭悊鍣锛屽畠镄勮繍绠楅熷害鍜屽诲潃鑳藉姏閮芥湁浜嗛炶穬镄勬彁鍗囥傛湰鏂囧皢娣卞叆鎺㈣64浣岰PU镄勭壒镣瑰拰浼桦娍锛屽府锷╄昏呮洿濂藉湴浜呜В杩欎竴澶勭悊鍣ㄣ
🚀杩愮畻阃熷害椋椤崌
64浣岰PU GPRs锛堥氱敤瀵勫瓨鍣锛夋暟鎹瀹藉害楂樿揪64浣嶏纴64浣嶆寚浠ら泦涓娆″彲杩愯64浣嶆暟鎹鎸囦护锛屼粎闇涓や釜鎸囦护锛屽嵆鍙涓娆℃彁鍙8涓瀛楄妭镄勬暟鎹銆傜浉姣32浣嶏纸闇锲涗釜鎸囦护锛屼竴娆℃彁鍙4涓瀛楄妭镄勬暟鎹锛夛纴镐ц兘缈诲嶏紒
🔍瀵诲潃鑳藉姏椋炶穬
64浣嶅勭悊鍣ㄩ噰鐢ㄧ壒娈婃暣鏁颁綔涓哄湴鍧锛孉LU锛堢畻链阃昏緫杩愮畻鍣锛夊拰瀵勫瓨鍣ㄨ交𨱒惧勭悊镟村ぇ鏁存暟锛屽嵆镟村ぇ鍦板潃銆俉indows Vista x64 Edition鏀鎸侀珮杈128GB鍐呭瓨鍜16TB铏氭嫙鍐呭瓨锛岃32浣岰PU鍜屾搷浣灭郴缁熶粎鏀鎸4G鍐呭瓨銆
🌱杞浠剁敓镐侀愭ヤ赴瀵
鐩鍓嶏纴64浣嶅父鐢ㄨ蒋浠剁浉瀵硅缉灏戯纴浣嗛殢镌64浣嶆搷浣灭郴缁熺敤鎴风兢浣撶殑镓╁ぇ锛岃繖涓宸璺濇e湪缂╁皬銆傝槠铹32浣嶅簲鐢ㄧ▼搴忎粛鍙鍦64浣岖数鑴戜笂杩愯岋纴浣嗗弽涔嫔垯涓嶆垚绔嬨
👀灞曟湜链𨱒ワ纴64浣嶅紩棰嗘疆娴
64浣嶆搷浣灭郴缁熶綔涓32浣岖殑鍗囩骇鐗堬纴镐ц兘鍗撹秺锛屽皢鎴愪负链𨱒ヤ富娴併傞殢镞堕棿鎺ㄧЩ锛64浣嶅圭‖浠惰佹眰阃愭笎闄崭绠锛32浣岖粓灏嗘贰鍑鸿嗛噹銆傛妸鎻℃疆娴侊纴𨰾ユ姳64浣嶆搷浣灭郴缁燂紒
E. 谁知道为什么c语言程序为何可以在不同CPU上运行,还有,如果一个操作系统如果使用汇编语言开发,除了
因为运行的并不是C语言的代码,而是被编译器编译过的C语言代码,只要编译器设置正确,在不同的CPU上想完成相同的任务,C代码是完全一样的,只就是所谓的代码移植,编译好的C程序是不能移植的,但是相同的代码可以在任何有编译器的环境中编译.
至于操作系统,用汇编写的话,很难让人理解,查错,修改,升级都会比较麻烦,但是性能上,直接用汇编写,如果你的技术够高,肯定会比C的要好.
F. 高级编程语言也要编译成汇编语言,不同的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 是指令助记符,也就是汇编指令,而用汇编指令编写的程序也是需要编译成机器指令的。
指令C7对应的汇编码及含义