c 語言遵循的呼叫約定是 cdecl:
組合語言和 c 語言混合程式設計可分為兩大類:
系統呼叫是 linux 核心提供的一套子程式。
系統呼叫的入口只有乙個,即 0x80 號中斷,子功能號在暫存器 eax 中單獨指定。
呼叫「系統呼叫」有兩種方式:
當輸入的引數小於等於 5 個時,linux 用暫存器傳遞引數;當引數個數大於 5 個時,把引數按照順序放入連續的記憶體區域,並將該區域的首位址放到 ebx 暫存器。
在組合語言中匯出符號名用 global 關鍵字。
在 c **中只要將符號定義為全域性便可被外部引用,引用外部符號時用 extern 宣告即可。
為了訪問 io 介面電路上的暫存器,計算機系統為這些暫存器統一編址,即埠號。
address register 作為陣列的索引,data register 作為暫存器陣列中該索引對應的暫存器。
crt controller registers 暫存器組中的 address register 和 data register 的埠位址有些特殊,它的埠位址不固定,取決於 miscellaneous output register 暫存器中的 input/output address select 字段。
6.4.1 什麼是內聯彙編
gcc 支援在 c **中直接嵌入彙編**。
6.4.2 組合語言 at & t 語法簡介
at&t 中數字被優先認為是記憶體位址。
at&t 記憶體定址:
segreg(段基址): base_address(offset_address, index, size)
base_address 是基位址,可以為整數、變數名,可正可負。
offset_address 是偏移位址,index 是索引值,這兩個必須是 8 個通用暫存器之一。
size 是個長度,只能是 1、2、4、8。
6.4.3 基本內聯彙編
基本內聯彙編是最簡單的內聯形式,其格式為:
asm [volatile] ("assembly code")
assembly code 的原則:
在基本內聯彙編中,若要引用 c 變數,只能將它定義為全域性變數。如果定義為區域性變數,鏈結時會找不到這兩個符號。
6.4.4 擴充套件內聯彙編
asm [volatile] ("assembly code": output : input : clobber/modify)
assembly code: 使用者寫入得彙編指令。
output: 用來指定彙編**得資料如何輸出給 c **使用。
input: 用來指定 c 中資料如何輸入給彙編使用。
clobber/modify: 彙編**執行後會破壞一些記憶體或暫存器資源,通過此項通知編譯器,可能造成暫存器或記憶體資料得破壞,這樣 gcc 就知道哪些暫存器或記憶體需要提前保護起來。
序號佔位符是對在 output 和 input 中的運算元,按照它們從左到右出現的次序從 0 開始編號,一直到 9。
名稱佔位符與序號佔位符不同,需要在 output 和 input 中把運算元顯式地起個名字:
[名稱] "約束名" (c 變數)
運算元型別修飾符用來修飾所約束的運算元:記憶體、暫存器:
input
作業系統 第六章 同步
協作程序能與系統內的其他執行程序相互影響。協作程序或能直接共享邏輯位址空間 即 和資料 或能通過檔案或訊息來共享資料,然而共享資料的併發訪問可能導致資料的不一致 共享資料併發 並行訪問 例 有界緩衝 防止競爭條件方法 併發程序同步或互斥 互斥若能保證諸程序互斥進入關聯的臨界區,可實現對臨界資源的互斥...
作業系統概念第六章 同步
多個程序併發訪問和操作同一資料並且執行結果與訪問順序有關,稱為競爭條件。為防止出現競爭條件,需確保一次只有乙個程序可以運算元據,為此要求這些程序按照一定方式來進行同步。同步的解決方案1 互斥鎖 當乙個程序試圖獲取不可用的鎖時,它會阻塞,知道鎖被釋放。當有乙個程序在臨界區時,任何其他程序在進入臨界區時...
作業系統第六章 檔案管理
檔案在檔案系統中是乙個基本的管理單元,這個管理單元必然有一組屬性 資料形式 訪問控制屬性 組織形式和處理方法 作業系統中的各類檔案 管理檔案的軟體,以及管理檔案所涉及到的資料結構等資訊的集合 物件及其屬性 對物件操縱和管理的軟體集合 檔案系統的介面 close也會出錯,乙個是資料還沒有寫進乙個是檔案...