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

BASLOAD:BASIC 呼叫 DOS LOAD 功能的組合語言介面

     編輯:組合語言

前言:跨語言互操作的經典橋樑

在早期 PC 開發環境中,BASIC (特別是編譯型 BASIC 如 QuickBASIC) 常需載入並執行外部 .EXE/.COM 程式。但 BASIC 的執行期庫未直接暴露 DOS INT 21h, AH=4Bh (EXEC) 功能。BASLOAD.ASM 正是為了解決此問題而生:它是一個 FAR PROC,供 BASIC 以 CALL ABSOLUTE 或連結時期 PUBLIC 方式呼叫,透過系統參數區 (SYSPARM) 傳遞檔名與命令列參數,最終跳轉至 DOS LOAD 功能。

呼叫慣例與參數結構

BASIC 傳遞 4 個字串描述子 (String Descriptor) 至堆疊:

; 堆疊佈局 (高位址 → 低位址)
BP+12 : File Spec 1 描述子位址 (要載入的程式完整路徑)
BP+10 : Parameter 1 描述子位址 (命令列參數)
BP+8  : File Spec 2 描述子位址 (保留/次要程式)
BP+6  : Parameter 2 描述子位址

每個描述子結構為:[長度:WORD][位址:DWORD] (編譯型 BASIC 通常為近指標,段值在 DS)。

核心流程:搬移字串至 SYSPARM 區

程式先透過 INT 77h, DX='dk' 取得 SYSPARM 區段地址 (回傳於 AX),此為專屬通訊緩衝區。接著依序將 4 組字串搬移至固定偏移:

內容SYSPARM 偏移格式
File Spec 10ASCIIZ (以 0 結尾)
Parameter 181h長度前綴 + 內容 + CR (0Dh)
File Spec 2163 (0A3h)ASCIIZ
Parameter 2244 (0F4h)長度前綴 + 內容 + CR

搬移使用 REP MOVSB 高效完成,並妥善處理長度調整與結尾字元。

關鍵程式碼片段

CODE SEGMENT 'CODE'
ASSUME CS:CODE
PUBLIC BASLOAD
BASLOAD PROC FAR
PUSH BP
MOV BP,SP
PUSH DS
PUSH ES
MOV DX,'dk'
INT 77H ; 取得 SYSPARM 區段 → AX
MOV ES,AX ; ES 指向 SYSPARM
CLD ; 正向搬移\n /> ; --- File Spec 1 ---\n /> MOV BX,SS:[BP+12] ; 取得描述子位址\n /> MOV CX,DS:[BX] ; 長度\n /> MOV SI,DS:[BX+2] ; 字串位址\n /> MOV DI,0 ; SYSPARM 偏移 0\n /> REP MOVSB ; 搬移\n /> MOV BYTE PTR ES:[DI],0 ; ASCIIZ 結尾\n /> ; --- Parameter 1 ---\n /> MOV BX,SS:[BP+10]\n /> MOV CX,DS:[BX]\n /> MOV SI,DS:[BX+2]\n /> MOV DI,81\n /> INC CL ; 預留 CR 空間\n /> MOV BYTE PTR ES:[DI],CL ; 長度前綴\n /> DEC CL\n /> INC DI\n /> REP MOVSB\n /> MOV BYTE PTR ES:[DI],13 ; 加入 CR\n /> ... (File Spec 2, Parameter 2 同理) ...\n /> POP ES\n /> POP DS\n /> POP BP
RET 8 ; 清除 4 個參數 (8 位元組)\n />BASLOAD ENDP
CODE ENDS
END BASLOAD

設計亮點與限制

  • 零記憶體配置:直接使用 DOS 保留的 SYSPARM 區,無需額外緩衝區。
  • 呼叫慣例相容:嚴格遵循 BASIC FAR CALL 慣例,保存/恢復 BP, DS, ES, SS:SP。
  • 參數清理:RET 8 自動彈出 4 個 WORD 參數,符合 Pascal 呼叫慣例 (BASIC 預設)。
  • 限制:字串長度 ≤ 80 字元 (受 SYSPARM 區間隔限制);僅支援近指標描述子 (小模式 BASIC)。

歷史背景與現代映照

BASLOAD 屬於「語言邊界互操作」的典型產物。現代開發中,P/Invoke (C#)、JNI (Java)、FFI (Rust/Go) 解決同類問題,但核心挑戰不變:

  1. 呼叫慣例匹配 (堆疊/暫存器佈局)
  2. 資料結構編碼對齊 (字串描述子 vs 現代切片/字串物件)
  3. 生命週期管理 (誰配置/釋放記憶體)
  4. 錯誤傳播 (這裡直接跳轉 LOAD,錯誤由 DOS 處理,不返回 BASIC)

研讀這段 1984 年的程式碼,能深刻體會「薄介面層」設計哲學:最小化組合語言邏輯,僅做資料重排與中斷跳轉,將複雜性留給高階語言與作業系統。

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