首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

組語原始碼系列:Lattice C 程式 Ctrl-Break 捕獲處理常式 (BREAK.ASM)

     編輯:組合語言

前言

BREAK.ASM 為 Lattice C 編譯器提供的組語模組,讓 C 程式能捕獲使用者按下 Ctrl+C 或 Ctrl+Break,避免程式被 DOS 強制終止。透過攔截兩個中斷向量:

  • INT 23h:DOS Ctrl-Break 處理常式 (所有 DOS 版本皆有)。
  • INT 1Bh:IBM PC ROM BIOS 鍵盤驅動程式 Ctrl-Break 中斷 (僅 PC 相容機)。

介面設計

提供兩個 C 可呼叫函數:

  • capture(int *flag):安裝中斷處理常式,flag 為 C 程式中靜態整數變數位址,發生 Ctrl-Break 時設為 -1 (TRUE)。
  • release(void):還原原始中斷向量,恢復預設行為 (通常是終止程式)。

核心程式碼解析

capture proc near
    push bp; mov bp, sp
    push ds
    mov ax, word ptr [bp+args]   ; 取 flag 位址 (依大/小模型 args=4/6)
    mov cs:flag, ax
    mov cs:flag+2, ds            ; 存 flag 遠端址

    ; 取得原 INT 23h 向量
    mov ax, 3523h; int 21h
    mov cs:int23, bx; mov cs:int23+2, es
    ; 取得原 INT 1Bh 向量
    mov ax, 351Bh; int 21h
    mov cs:int1b, bx; mov cs:int1b+2, es

    ; 設定新向量指向 ctrlbrk
    push cs; pop ds
    mov dx, offset ctrlbrk
    mov ax, 2523h; int 21h
    mov ax, 251Bh; int 21h
    pop ds; pop bp; ret
capture endp

ctrlbrk proc far            ; 中斷處理常式
    push bx; push ds
    mov bx, cs:flag
    mov ds, cs:flag+2
    mov word ptr ds:[bx], -1 ; 設 flag = TRUE
    pop ds; pop bx
    iret
ctrlbrk endp

release proc near           ; 還原向量
    push bp; mov bp, sp
    push ds
    mov dx, cs:int1b; mov ds, cs:int1b+2
    mov ax, 251Bh; int 21h
    mov dx, cs:int23; mov ds, cs:int23+2
    mov ax, 2523h; int 21h
    pop ds; pop bp; ret
release endp

關鍵技術細節

  1. 遠端指標儲存:flag 為雙字 (段:位移),因 C 程式可能在不同區段 (大模型)。
  2. 中斷處理常式限制:ctrlbrk 可能在鍵盤中斷內執行 (非同步),嚴禁呼叫 DOS 功能 (INT 21h),否則導致系統崩潰。僅執行極簡單操作:設旗標。
  3. 模型相容:透過 if lprog 判斷大/小模型,調整參數堆疊偏移 args。
  4. 自動清理:DOS 程式結束時會自動還原 INT 23h,但 INT 1Bh 需手動 release。

使用範例 (C 語言)

static int break_flag = 0;
int main() {
    capture(&break_flag);
    while (!break_flag) {
        // 主迴圈運算
    }
    release();
    printf("User pressed Ctrl+Break\n");
    return 0;
}

歷史背景與現代對應

  • DOS 程式無訊號機制,Ctrl+C 直接觸發 INT 23h 終止進程,捕獲機制對長時間運算程式 (編譯器、資料庫、通訊軟體) 至關重要。
  • Windows 主控台程式使用 SetConsoleCtrlHandler 捕獲 CTRL_C_EVENT、CTRL_BREAK_EVENT,原理類似但由作業系統管理執行緒同步。
  • Linux/Unix 使用 signal(SIGINT, handler)。

學習價值

  1. 中斷向量獲取/設定 (INT 21h AH=35h/25h) 實作。
  2. 組語與高階語言 (C) 混合程式設計:參數傳遞、遠端指標、記憶體模型。
  3. 非同步中斷處理常式的安全編程限制 (不重入、不呼叫 DOS/BIOS)。
  4. TSR 風格的常駐與清理模式 (capture/release 配對)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved