310 likes | 462 Views
第 10 章. 高階語言的聯結. 本章提要. 記憶模式 節區的宣告 組合語言的標準格式 組合語言與 C 的聯結 傳引數 PROC 與 . MODEL 功能. 記憶模式. TINY 模式 SMALL 模式 MEDIUM 模式 COMPACT 模式 LARGE 模式 HUGE 模式 FLAT 模式. SMALL 模式. 簡易的節區宣告. . CODE [name]: 程式節區 .DATA: 已初值化的資料節區 .DATA?: 未初值化的資料節區 .FARDATA [name]: 用來存放已初值化的遠程資料節區
E N D
第 10 章 高階語言的聯結
本章提要 • 記憶模式 • 節區的宣告 • 組合語言的標準格式 • 組合語言與 C 的聯結 • 傳引數 • PROC 與 .MODEL 功能
記憶模式 • TINY 模式 • SMALL 模式 • MEDIUM 模式 • COMPACT 模式 • LARGE 模式 • HUGE 模式 • FLAT 模式
簡易的節區宣告 • .CODE [name]:程式節區 • .DATA:已初值化的資料節區 • .DATA?:未初值化的資料節區 • .FARDATA [name]:用來存放已初值化的遠程資料節區 • .FARDATA? [name]:用來存放未初值化的遠程資料節區
簡易的節區宣告 • .CONST:常數節區 • .STACK [size]:堆疊節區
暫存器的初值 • 當 MASM 組譯好程式時, 會在 EXE 檔案內記錄下 cs:ip、ss:ip 等暫存器的初始值, MS-DOS 在載入程式時便會把這些值設給 cs:ip、ss:ip 暫存器 • 至於 ds、es 則是指向 PSP 開頭, 所以要自行以:mov ax,@data 及 mov ds,as 來把 ds 指向 .DATA (或 DGROUP) 開頭
ASSUME 假指令 • 當 MASM 在處理一個標名時, 它必須知道該標名位址是針對於哪個節區來計算的。ASSUME 就是用來通知 MASM 這項訊息的, 其格式如下: ASSUME 節區暫存器名:節區名 [ , 節區暫存器名 :節區名….. ]
.DOSSEG • DOSSEG 是一個假指令, 用來通知 MASM 依 Microsoft 之標準來安排各節區的次序
組合語言與 C 的聯結 • 把組合語言副程式以標準格式寫好 • 組合語言副程式名要小寫, 並以 ‘_’ 開頭, 同時要宣告為 PUBLIC • 在 C 程式中, 要把組合語言函式宣告為 extern (注意! 與 MASM 的 EXTRN 差一個字母)
.MODEL 的主要改進功能 • 可指定所要聯結的語言, 如 .MODEL SMALL, C 就指定要和 C 語言聯結 • 凡是 .MODEL 之後指定聯結語言者, 其副程式名可不用宣告為 PUBLIC • 副程式名前頭不再須要以 ‘_’ 做開頭
PROC 功能 • PROC 格式如下: • USES 可以指定副程式中將要用到的暫存器, MASM 便會自動把這些暫存器存入堆疊, 例如:
使用 VARARG 的注意事項 • VARARG 只能用在最後一個引數 • 先將 PROC 所要聯結的語言種類設為 C, 才能使用 VARARG
表示 buffer 是一個 30 bytes 的區域陣列變數, MASM 會把 sp 自動上移 (減) 30 bytes 以留出空間給 buffer[] 陣列使用: 區域變數也可以是陣列