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對應的匯編碼及含義