※ 引述《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