我們繼續向下做個類比。既然C總要經過彙編一層,那為什麼有人用C而不是直接用匯編呢?
先用匯編函式呼叫為例子。一個C函式的呼叫,在C語言裡就是一行搞定,指定函式名,傳入實參列表,獲取返回值即可。但在彙編的層級,則要做如下工作:
再舉個嵌入式程式設計裡,中斷處理的例子。中斷處理是由CPU硬體觸發的事件處理。在C語言裡只需要按照嵌入式庫的規範,編寫名稱符合要求的函式放那裡就行了。當事件發生時,自然後由CPU呼叫這個函式來處理對應的硬體事件。而如果用匯編來寫,則要這麼做:
在各種體系結構上,如上過程會有一些區別,但大體含義如此。
那麼回到題主的問題,反正底層都是要用匯編的,為何還要用C?
因為一些簡單的程式設計正規化,比如函式呼叫,C語言已經幫程式設計師遮蔽了實現細節,只需要簡短的語句就能實現。只需要很短的程式碼就能實現需求,而非陷入一些不必要的細節裡反覆糾結。
高階語言如Python/Java也是如此。
我們繼續向下做個類比。既然C總要經過彙編一層,那為什麼有人用C而不是直接用匯編呢?
先用匯編函式呼叫為例子。一個C函式的呼叫,在C語言裡就是一行搞定,指定函式名,傳入實參列表,獲取返回值即可。但在彙編的層級,則要做如下工作:
找到棧地址,將其載入到暫存器將第一個引數入棧將第二個引數入棧,如下若干引數入棧不表返回地址入棧跳轉到函式地址開始執行將返回地址存入暫存器函式執行結束,將此次呼叫棧恢復棧頂指標位置,即所有引數被忽略返回值入棧跳轉到返回地址再舉個嵌入式程式設計裡,中斷處理的例子。中斷處理是由CPU硬體觸發的事件處理。在C語言裡只需要按照嵌入式庫的規範,編寫名稱符合要求的函式放那裡就行了。當事件發生時,自然後由CPU呼叫這個函式來處理對應的硬體事件。而如果用匯編來寫,則要這麼做:
用符號定義來制定中斷處理的入口地址將中斷處理符號地址存入中斷向量表中斷髮生時,CPU的PC指標跳轉到中斷處理入口地址儲存所有暫存器到記憶體遮蔽其他中斷使能開關,避免中斷巢狀發生,當然高階玩法也可以用巢狀中斷處理結束,將記憶體裡備份的之前執行序的暫存器內容恢復到暫存器PC指標跳轉到之前執行序的位置在各種體系結構上,如上過程會有一些區別,但大體含義如此。
那麼回到題主的問題,反正底層都是要用匯編的,為何還要用C?
因為一些簡單的程式設計正規化,比如函式呼叫,C語言已經幫程式設計師遮蔽了實現細節,只需要簡短的語句就能實現。只需要很短的程式碼就能實現需求,而非陷入一些不必要的細節裡反覆糾結。
高階語言如Python/Java也是如此。