本文收錄 Lattice C 編譯器 DOS 函數庫中的 _charop 組合語言實作。該函數封裝 DOS 2.0 INT 21h AH=55h 服務,用於取得/設定開關字元 (SwitChar) 以及查詢/設定裝置可用性。雖極簡短,卻完美示範了組合語言實作 C 庫函數的參數傳遞慣例、暫存器使用、中斷呼叫封裝。
int _charop(int al, int dl); // C 宣告
; 功能對應:
; al=0, dl=0 : 取得開關字元 (預設 '/')
; al=1, dl=字元 : 設定開關字元
; al=2, dl=0 : 取得裝置可用性位圖
; al=3, dl=值 : 設定裝置可用性
title MSDOS 2.00 Function Library for Lattice C
subttl -
;;
;;FUNCTION: Sets and returns switch character and device availability.
;;
;;CALL:
;; ret= _charop(al,dl)
;; int ret; DL return value,
;; int al; charoper function
;; int dl; charoper data
;;
;;RETURN: See the DOS docs for details.
;; _charop(0,0) returns the ASCII switch char,
;; _charop(1,'-') sets the switch to -,
;; _charop(2,0) returns device availability,
;; _charop(3,i) sets device availability.
;;
;;LONG 32 bits (4 bytes)
;;INT 16 bits (2 bytes)
;;CHAR 8 bits (1 byte
;;
page
pgroup group prog
prog segment byte public 'prog'
assume cs:pgroup,ds:pgroup
public _charop
_charop proc near
push bp
mov bp,sp
mov al,[bp+4] ; 取得第一參數 al (函數代碼)
mov dl,[bp+6] ; 取得第二參數 dl (資料)
mov ah,55 ; DOS 2.0 功能 55h - 字元操作
int 33 ; INT 21h (33 decimal = 21h)
mov al,dl ; 返回值在 DL,移至 AL
mov ah,0 ; 擴展為 16 位整數返回
pop bp
ret
_charop endp
prog ends
end
push dl; push al (或對應寬度)。BP 指向堆疊幀,[BP+4] 為第一參數 al,[BP+6] 為第二參數 dl (因 IP 佔 2 位元組,BP 佔 2 位元組)。AX (16 位整數)。BP, DS, SS, SI, DI 需保存 (此處僅用 BP),AX, BX, CX, DX, ES 可自由使用。| AL (子功能) | 輸入 DL | 輸出 DL | 說明 |
|---|---|---|---|
| 00h | 忽略 | 當前開關字元 | 取得 SwitChar (預設 2Fh '/') |
| 01h | 新開關字元 | 無 | 設定 SwitChar |
| 02h | 忽略 | 裝置可用性位圖 | Bit 0=CON, 1=AUX, 2=PRN, 3=CLOCK$... |
| 03h | 新位圖值 | 無 | 設定裝置可用性 |
| DOS / Lattice C | 現代對應 |
|---|---|
| 開關字元 ('/' 或 '-') | CLI 解析庫 (getopt, argparse, CLI11) 自動處理 |
| 裝置可用性位圖 (CON/AUX/PRN) | 裝置驅動程式模型、即插即用、SetupDi API |
| INT 21h 系統呼叫 | Win32 API / 系統呼叫 (syscall/sysenter) |
| Small Model 近呼叫慣例 | x64 快速呼叫慣例 (RCX,RDX,R8,R9...) |
| .OBJ 連結為 .LIB | 靜態庫 .lib / 動態連結 .dll / NuGet 套件 |
push bp; mov bp,sp) 與參數存取BP, SI, DI, DS, SS 非易失性,AX, BX, CX, DX, ES 易失性DL → C 返回 AXPROC/ENDP、PUBLIC、段組織_charop 雖僅 11 行指令,卻浓缩了組合語言介面 C 語言、封裝 DOS 系統服務、遵循呼叫慣例、暫存器管理、極致精簡的所有核心要素。它是早期 PC 時代編譯器運行庫開發的縮影,也是理解「系統程式設計」基礎的最佳切入點之一。