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

組語原始碼系列:BASIC 編譯程式啟動模組 (BASMAIN.ASM)

     編輯:組合語言

前言

BASMAIN.ASM 是 Microsoft BASIC 編譯器 (BC) 產生的可執行檔前置模組,負責在 BASIC 主程式 ($$main) 執行前:

  1. 將 PSP (Program Segment Prefix) 區段位址存入 DOS 通訊區 (0:04F2h),供 BASIC 運行期庫存取命令列參數。
  2. 解析命令列參數 /M:nnn,限制程式最大可用記憶體 (nnn KB,範圍 64~1024)。
  3. 若記憶體限制失敗顯示錯誤訊息但繼續執行。
  4. 最後跳轉至 $$main 進入 BASIC 程式邏輯。

核心流程詳解

basmain proc far
    assume cs:cseg, ds:cseg, ss:nothing, es:nothing
    push ds
    xor ax, ax
    mov ds, ax                ; DS=0 存取 IVT/DOS 通訊區
    mov si, 4F2h
    mov ax, es                ; ES = PSP 區段
    mov [si], ax              ; 存入 0:04F2h
    pop ds

    mov si, 80h               ; PSP:80h = 命令列長度+字串
    mov ch, 0
    mov cl, [si]              ; CL = 長度
    jcxz p025                 ; 無參數直接跳轉

p010: inc si
    mov al, [si]
    cmp al, '/'               ; 尋找 '/'
    jnz p020
    mov ax, [si+1]
    cmp ax, ':M'              ; "/M" 或 "/m"
    jz p030
    cmp ax, ':m'
    jz p030
p020: loop p010
p025: jmp p080                ; 找不到 /M 直接進入 BASIC

p030: ; 解析 /M:nnn
    add si, 3                 ; 指向數字
    mov ax, 0
    mov bx, 0
    mov cx, 10
p040: mov bl, [si]
    cmp bl, '0'; jb p050
    cmp bl, '9'; ja p050
    sub bl, '0'               ; ASCII 轉數值
    mul cx                    ; AX *= 10
    add ax, bx                ; 累加
    inc si
    jmp p040

p050: cmp ax, 64;  jb p060    ; <64K 錯誤
    cmp ax, 1024; ja p060     ; >1024K 錯誤
    mov cl, 6
    sal ax, cl                ; KB 轉段落 (*64)
    mov bx, es                ; PSP 區段
    add bx, ax                ; 新記憶體頂端
    mov si, 2                 ; PSP:02h = 目前記憶體頂端
    mov ax, [si]
    cmp ax, bx
    jae p055                  ; 新設定較大不可行
    mov dx, offset msg2       ; "Unable to limit memory"
    jmp p065
p055: mov [si], bx            ; 更新 PSP:02h
    jmp p080

p060: mov dx, offset msg1     ; "Memory specification must be from 64 to 1024"
p065: add dx, 100h            ; PSP 位移調整
    mov ah, 9
    int 21h                   ; DOS 列印字串 (以 $ 結尾)

p080: jmp $$main              ; 進入 BASIC 主程式
basmain endp

關鍵資料結構

  • PSP (Program Segment Prefix):DOS 為每個程式建立的 256 位元組控制區塊,位於程式載入區段起始。
    • Offset 02h:程式記憶體頂端段落號 (預設 = 可用記憶體盡頭)。
    • Offset 80h:命令列長度 (1 byte) + 命令列字串。
  • DOS 通訊區 0:04F2h:BASIC 運行期庫約定的 PSP 區段存放位置。

連結指令

LINK BASMAIN+yourprog, yourprog, NUL.MAP, BASCOM

BASMAIN 必須為第一個模組,且 end basmain 指定程式進入點。

歷史背景與現代對應

  • 早期 BASIC 編譯器 (QuickBASIC, BASIC Compiler 6/7) 產生的 .EXE 皆附帶此啟動代碼。
  • /M 參數解決 DOS 640KB 記憶體限制下的大型程式記憶體管理需求。
  • 現代 Windows 不再使用 PSP、實模式記憶體模型;記憶體管理由作業系統虛擬記憶體系統自動處理。

學習重點

  1. DOS PSP 結構與應用程式啟動流程。
  2. 命令列字串手動解析技巧(無庫函數輔助)。
  3. 直接操作 DOS 通訊區、中斷 21h 功能 09h 列印字串。
  4. 模組化連結順序與進入點控制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved