本文收錄 BRK.ASM,功能為攔截 DOS Ctrl-Break 中斷 (INT 23h),在中斷處理常式中設定旗標變數 brkflag,供主程式輪詢檢查使用者是否按下 Ctrl-Break 或 Ctrl-C。展示了中斷向量修改 (INT 21h AH=25h)、中斷處理常式編寫、旗標同步、極簡模組化結構 (代碼段/資料段分離)。
PGROUP Group PROG
DGROUP Group DATA
DATA Segment Public 'DATA'
public brkflag
brkflag DW 0
DATA ends
PROG Segment Para Public 'PROG'
public TrapBrea
assume cs:PGROUP,DS:DGROUP
TrapBrea proc near
push ds
push cs
pop ds
mov dx,offset PGROUP:Bret
mov ah,25h
mov al,23h
int 21h
pop ds
ret
TrapBrea endp
Bret proc far
push ds
push ax
mov ax,DGROUP
mov ds,ax
mov brkflag,1
pop ax
pop ds
iret
Bret endp
PROG ends
end
push ds
push cs
pop ds ; DS = CS (程式碼段),因為 Bret 在同一段
mov dx,offset PGROUP:Bret ; DX = 處理常式偏移
mov ah,25h ; DOS 設定中斷向量功能
mov al,23h ; INT 23h (Ctrl-Break)
int 21h
pop ds
ret
AH=25h, AL=中斷號:設定中斷向量表項目為 DS:DXINT 23h 指向 BretDS 指向包含 Bret 的段 (此處用 push cs/pop ds)
Bret proc far
push ds
push ax
mov ax,DGROUP
mov ds,ax ; DS = 資料段,以存取 brkflag
mov brkflag,1 ; 設定旗標 = 1 (偵測到 Ctrl-Break)
pop ax
pop ds
iret ; 中斷返回 (恢復旗標、CS:IP)
FAR PROC:中斷處理常式必須是遠程序 (含段基址)IRET:恢復 CS:IP, FLAGS,區別於 RETbrkflag 在資料段 (DGROUP),主程式可透過 EXTRN brkflag:WORD 存取
; 主程式啟動時呼叫 TrapBrea 安裝處理常式
call TrapBrea
; 主迴圈中輪詢
main_loop:
; ... 處理工作 ...
mov ax, brkflag
test ax, ax
jz main_loop ; 旗標=0 繼續
; 旗標=1:使用者按下 Ctrl-Break
; 執行清理、退出等邏輯
mov brkflag, 0 ; 重置旗標 (可選)
| 特性 | BRK (本文) | BRK2 (下文) |
|---|---|---|
| 保存舊向量 | 否 (直接覆蓋) | 是 (AH=35h 取得,AH=25h 恢復) |
| 移除處理常式 | 無 | 提供 REM_BRK_HANDLR |
| 檢查函數 | 直接讀 brkflag | CHECK_BREAK 封裝 (歸零旗標) |
| 模組介面 | 簡單 | 完整 (PUBLIC 4 個函數) |
| BRK 技術 | 現代對應 |
|---|---|
| INT 23h Ctrl-Break 攔截 | Windows SetConsoleCtrlHandler、POSIX signal(SIGINT)、Console.CancelKeyPress |
| 旗標輪詢檢查 | 原子布林旗標 std::atomic、volatile sig_atomic_t、CancellationToken |
| 中斷向量修改 AH=25h/35h | OS 核心中斷描述符表 (IDT) 管理、使用者態信號處理器註冊 |
| IRET 返回 | sigreturn/sysret/iretq |
AH=25h/35h, AL=中斷號, DS:DX=新向量FAR PROC、保存/恢復暫存器、IRET、極短執行時間、避免 DOS 重入MOV AX,DGROUP; MOV DS,AX 切換資料段GROUP/SEGMENT/PUBLIC/EXTRN 實現獨立編譯/連結BRK.ASM 是非同步事件 (Ctrl-Break) 同步化處理的教科書範例:中斷端只做最小動作 (設旗標),主程式同步點輪詢旗標決定流程。這種「中斷設旗、主迴圈檢查」模式在嵌入式系統、即時作業系統、信號處理、遊戲迴圈中普遍存在。程式雖小 (約 30 行),卻完整呈現了中斷安裝、處理常式編寫、跨段資料存取、旗標同步的核心閉環。