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

DOS 五大標準裝置的六種 I/O 重導向與管道原理實作

     編輯:組合語言

重導向實驗:以 MASM 條件組譯控制五大標準控制代碼

程式 a.asm 透過命令列參數 /Darg=N 決定操作目標:

  • N=0 (STDIN):二進位讀一字元,再從 txt 讀 't' 到 char
  • N=1 (STDOUT):輸出 char '1' 到 txt
  • N=2 (STDERR):輸出 char '2' 到 txt
  • N=30/31 (STDAUX):30 從 txt 讀 't',31 輸出 '3'
  • N=41 (STDPRN):輸出 '4' 到 txt

核心 DOS 中斷 21h 功能:3Dh 開檔、45h 複製控制代碼、46h 強制重導向、3Fh/40h 讀/寫、3Eh 關檔。鍵盤輸入經 44h 設為二進位模式,利用 BIOS 鍵盤緩衝區(40:1Eh~3Dh)捕捉掃描碼與 ASCII 碼對應關係(如 Ctrl+C、F1)。

MORE.COM 反組譯揭示管道與檔案引用計數機制

DOS 3.31 版 MORE.COM 處理管道輸入時 不建立新進程:

  1. 45h 複製 STDIN(代碼 0)到 BP,再 3Eh 關閉原 STDIN
  2. 45h 複製 STDERR(代碼 2)或執行時開啟的控制代碼,佔用剛釋放的 0 號槽
  3. 3Fh 從 BP 讀資料(管道或鍵盤),一次最多 1000 位元組
  4. 逐字元處理:換行計行、Tab 對齊、Backspace 退格、^Z 結束
  5. 滿螢幕顯示 -- More --,0C08h 清鍵盤緩衝並從 STDERR 讀一鍵(不動管道指標)
  6. 02h 輸出到 STDOUT,支援再接管道

實驗證明:type a.asm | a.com 會因管道重導向觸發蜂鳴;a.com a.com 則以 FCB 與 Handle 重複開啟同檔,經 45h/46h 複製/強制重導向後 4B00h 執行子進程,螢幕顯示計數 11231123,印證檔案引用計數遞增機制。

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