① 機器碼、CPU指令集、匯編指令集、操作系統、API介面、C標准庫的關系。
你好,我來初步解釋你所提的問題,僅供參考。
1、不同的CPU肯定對應不同的機器碼,其實這種說法不規范,應該是不同的機器碼集,或機器指令集,因為匯編指令和機器指令是一一對應的,也可以說成是匯編指令集。我們編寫的程序最後都是處理(這里的處理根據不同的高級語言,可能是解釋、預編譯、編譯、鏈接等等)成由匯編指令集裡面的指令構成的指令序列,然後調入內存,再一條條由知道這每條指令干什麼用的CPU來執行的。
你說的「+」號,其實就是加法指令,當然不可能是「010101」,因為沒有6位的指令,只可能是4位、8位、16位、32位、64位。
位數相同不同型號的CPU,指令集略有不同的,但絕大多數指令應該是相同的。比如類似你說的「+」等算術運算,當然還有更多的其它指令,都是相同的二進制編碼。這就是你的同一台電腦可以使用INTEL的CPU,也可以使用AMD的CPU的原因,並不會因為你換了CPU,電腦就不能運行了。
那麼32位的CPU還能執行16位的指令嗎?那麼64位的CPU還能執行32位、16位的指令嗎?這就看CPU是否向下兼容了。如果你的程序(exe文件)很老,一運行就出錯,或者藍屏了,呵呵,就不兼容了。CPU不再認識你的程序里的那些「老」指令了。
2、這個問題在回答1里已經說的很清楚了,機器碼就是CPU的指令,CPU的指令集就是機器碼的集合,說白了,就是CPU的API(應用程序編程介面),只不過這里的應用指的是匯編語言。
3、和2是同一個問題,匯編指令集當然和CPU指令集是一一對應的。一種新的CPU生產出來後,它的指令集就是固定的。生產廠家就會推出對應的新的匯編系統,與其指令集相配套。然後那些編譯系統開發商們也會對他們的系統進行升級,增加新的特性。
4、C標准庫也是機器指令構成的程序,當然和CPU指令集有關系。所謂的標准,不是針對機器語言來說的,而是針對C語言的編碼來說的。比如sin(x);這個函數,在不同的電腦(PC機、蘋果機甚至手機、單片機等),用C語言編寫代碼時,都是sin(x),不會是別的(比如sn(x))。諸如此類的所有函數形成的集合就是一個標准庫。所以我們編寫的標准C程序,可以再PC機上編譯成PC機能運行的機器指令,也可以再蘋果機上編譯成蘋果機能運行的機器指令,PC機上有PC機的"翻譯",蘋果機上有蘋果機的「翻譯」,他們將這個你編寫的這個相同的C程序翻譯成不同的機器指令,但最終程序的運行結果是一樣的。這就是可移植性,因為遵循了標准。標准不光指的標准庫,還包括數據類型、關鍵字、運算符、語法等。標准庫的實現當然和你所使用的計算機的CPU的指令集是緊密相關的。C的編譯器的實現可以是機器語言、匯編語言,也可以是C語言實現。呵呵,這個好像不太好理解。所謂的編譯,就是將你的由字元構成的源程序轉化成機器能理解的二進制,二進制無非是0、1構成的一串符號,先存在硬碟,再調入內存運行。機器語言、匯編語言、C語言都能處理二進制,都能生成那個最終的二進制文件,明白了吧。
C庫函數和windows api基本沒有關系。windows有自己的一套庫函數,就是API,事實上,C的標准庫已經沒有多大意義了。如果我們編寫沒有圖形界面的某些應用程序,如控制台應用程序,可能還會用到標准庫。
5、windows如果不知道CPU的指令集,如何發揮windows的最佳效率?而匯編語言、C語言和CPU聯系的最緊密,當然要用它們來寫。
所謂封裝,就是隱藏其實現,暴露其介面。正如CPU一樣,我們知道ADD A,B是計算A加B,怎麼計算的,不用知道。CPU指令集就是這台裸機(無操作系統)給我們的一個API。
一台安裝了windows系統的計算機,其實是一台建立在裸機基礎上的「虛擬機」。這就好比一個初生兒和一個成人一樣,初生兒其實具備了一個人的所有特徵,但你無法和他交流(即使是機器語言也不行,呵呵),但他的確什麼都會,你能說一個初生兒不會說英語嗎,他會的,他已經具備了說英語的所有條件,因為他有嘴巴、會發音,有嘴巴就會說。但是讓初生兒說英語實在是太難了,也就是這個API不好弄。一個成人就是安裝了操作系統的長大了的初生兒,他的功能更多了。比如肌肉發達了(相當於外設增加了),能很看懂英語和說英語了(高級語言有了)。但最終還是要和初生兒一樣用嘴巴說英語!只不過說的更好聽而已,也就是API更豐富罷了。但不論你吃的是什麼山珍海味,還是五穀雜糧,最終都轉換成氨基酸、葡萄糖、微量元素和水供腸胃吸收。不論你用什麼語言編寫的程序,最終都是CPU執行的二進制機器指令。
API本質上一個windows系統調用的集合,調用windows給我們提供的所有功能,比如創建一個窗口。如果windows沒有提供這個集合,那麼windows還有用嗎?至於windows是怎麼提供這個API的,API是怎麼實現的,這個就要問microsoft了。
② 可以由匯編程序翻譯成對應的機器碼的指令是偽代碼嗎
偽代碼:一般我們寫的程序代碼都是偽悉汪代碼由編譯器轉化成對應的機器碼的指令,才可以被及其執行。
segment 和ends是一對承兌使用的偽指令,這是可搏陸培被匯編編譯的指令
codesg segment ;這個段從這里開始
codesg ends ;這個段這里介紹
注codesg是段名
end是匯編程序的結束標記,編譯器在編譯匯編程序的過程中,碰到偽指令end就表示程序結束了
注: end和ends是兩個指令 ends與 segment對應
assume: 這個指令時假設的意思寄存器和程序中某一段相關基唯聯,通過assume說明這種關聯