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

DOS 時代組合語言原始碼賞析:BRK Ctrl-Break 中斷處理器 (簡易版)

     編輯:組合語言

前言

本文收錄 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

核心機制解析

1. 安裝中斷處理常式 (TrapBrea)


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:DX
  • 此處將 INT 23h 指向 Bret
  • 需確保 DS 指向包含 Bret 的段 (此處用 push cs/pop ds)

2. 中斷處理常式


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,區別於 RET
  • 極短執行時間:僅設定旗標,無 DOS 呼叫 (中斷環境下不可重入 DOS)
  • 旗標 brkflag 在資料段 (DGROUP),主程式可透過 EXTRN brkflag:WORD 存取

3. 主程式使用方式 (概念)


; 主程式啟動時呼叫 TrapBrea 安裝處理常式
call TrapBrea

; 主迴圈中輪詢
main_loop:
 ; ... 處理工作 ...
 mov ax, brkflag
 test ax, ax
 jz main_loop       ; 旗標=0 繼續
 ; 旗標=1:使用者按下 Ctrl-Break
 ; 執行清理、退出等邏輯
 mov brkflag, 0     ; 重置旗標 (可選)

進階版本對比:BRK2 (下一文件)

特性BRK (本文)BRK2 (下文)
保存舊向量否 (直接覆蓋)是 (AH=35h 取得,AH=25h 恢復)
移除處理常式無提供 REM_BRK_HANDLR
檢查函數直接讀 brkflagCHECK_BREAK 封裝 (歸零旗標)
模組介面簡單完整 (PUBLIC 4 個函數)

現代對應

BRK 技術現代對應
INT 23h Ctrl-Break 攔截Windows SetConsoleCtrlHandler、POSIX signal(SIGINT)、Console.CancelKeyPress
旗標輪詢檢查原子布林旗標 std::atomic、volatile sig_atomic_t、CancellationToken
中斷向量修改 AH=25h/35hOS 核心中斷描述符表 (IDT) 管理、使用者態信號處理器註冊
IRET 返回sigreturn/sysret/iretq

學習重點

  • DOS 中斷向量修改標準流程: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 行),卻完整呈現了中斷安裝、處理常式編寫、跨段資料存取、旗標同步的核心閉環。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved