精華區beta Programming 關於我們 聯絡資訊
※ 引述《tester.bbs@bbs.csie.ncu.edu.tw (try or test)》之銘言: : > 我在前面的文章就已經說過 : > 組合語言之於C語言,它的強項在於,它可讓程式設計者 : > 清楚的掌握程式碼或資料在記憶體中確切的Layout位置、尺寸大小 : > C 語言則不行 : C 語言程式編譯時, 絕對是能列出組語的程式與機器碼出來看的, 而且 : 也有其一定的規則性, 相對於某個資料或程式的位置, 其相對位置都是 : 能估算的, 若說要清楚的掌握, 其關鍵都不是程式語言本身, 連組語也 : 是如此, 這是由 Linker 與 loader 決定的. : C 的 pointer 就是用來處理資料的相對位置的, 資料型態宣告的 : 作用之一就是明示資料的尺寸大小. 就這個位置的要求言, 只要是相對 : 的, 很多高階語言也都做得到, 而決定絕對位置的是 loader 不是語言. : 高階語言提供的程式應該是要儘量跟編譯器的版本無關, 如果是要計算 : 相對位置, 那組語的相對位置是程設員可以決定的, 同樣一段相同動作 : 的碼也是程設員決定的, 不因組語版本而變. 但高階語言則不然, 一段 : 相同的動作可能被不同版本的不同碼段替換掉了. 這是編譯器實作時的 : 版本問題. 但這也不會是 UNIX 沒有全部用 C 寫的原因. : 組合語言只有一個強項, 就是她可以任意組合出任何高階語言都編不出 : 來的指令組合. 這種組合包含很巧妙與一無是處的混亂組合. : > 例如硬碟中的Boot loader (Stag 1)就有大小要為512 Byte, : > 特定位置要有特定資料的需求 : Boot Sector 的內容是有特定標幟要標明這是一段可執行的 boot : program , 但並非 C 語言程式就造不出來. 不同的CPU有不同的Assembly, 跟計算相關的部份 C 可以應付, 和Address相關的部份用 C 配合 Link Editor 也可以處理, 不過 有些控制 CPU Status 的指令, 就只能用 Assembly 了, 例如 在Bootstrap的時候要把Register和Cache都設好, 或者在OS中的 Critical Section也要把Interrupt關起來, 一般Boot Section 只做一些簡單的工作, 用Assembly就好了, 如果真的想多做一點 事再配合一些C Function, 不過在load整個系統時, 一樣得用 Assembly才行, 因為要jump到主系統時, 還是得控制CPU的Status. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.23.107