彭民德:《電子計算60年》 (23)駕馭PC,應用開發百花齊放

彭民德發表於2016-09-19

PC機有豐富的資源,提供了廣闊的運用天地。而且作為個人計算機,它可以在多個層面上任你自己駕馭擺佈,讓人有“海闊憑魚躍,天高任鳥飛”的感覺。

在直接使用層面,它提供豐富的命令或實用程式,可以按互動方式選擇執行。比如,計算器、日曆、時鐘程式,磁碟格式化程式,檔案拷貝程式等幾十上百個,還有一些遊戲程式。到了影像式螢幕時代,所提供的實用程式就更多了。下班回到家,常常玩電腦下棋、打撲克牌之類遊戲。跟以往的多使用者機相比,微機上的實用程式除了沒有專門針對多使用者通訊和管理的部分,其它程式都大為擴充了。

如果需要程式設計序做點事情,或者就是程式設計玩玩機器,那也好辦,既可以通過基於8086/8088晶片的組合語言程式設計,也可以用陸續提供的高階語言程式設計,比如後來有了DOS版本的C語言Turbo-C。無論用什麼語言工具,都可以從不同層面上去駕馭機器的資源。不同的開發層面包括:MS-DOS外殼;系統功能呼叫int 21h;軟中斷呼叫和機器硬體。於是為了做好一件事,有多種選擇餘地。資源則包括機器硬體、系統資料和軟體。

系統功能呼叫是第三代計算機作業系統的系統呼叫,是作業系統的程式設計介面,也是它主要的對外介面。MS-DOS提供了近百個系統動能呼叫,通過它們可以做PC機所能夠做的幾乎所有工作。

PC機硬體包括由CPU和記憶體組成的主機,以及鍵盤、顯示器、磁碟、印表機等外設,對機器硬體可以程式設計控制。這在以往是難以想象的。早期計算機雖然硬體由操作員操縱,但那是手工式功能單一的操縱,不得已而為之,非程式控制。而且也只有啟停某臺外設這樣簡單的功能。在微型機上怎麼控制CPU?有一對指令,cli關閉中斷,sti開放中斷,讓你能夠隨後執行在開或者關中斷狀態下的相應操作。怎麼控制記憶體?程式一般是通過變數的符號名,訪問由編譯程式和作業系統先後分配的地址,但也提供記憶體地址直接讀寫,於是可以訪問記憶體低地址(0:000-0:3FFH)的中斷向量表,訪問顯示器的顯示緩衝區,甚至可以訪問任何記憶體地址。對記憶體的控制還可以把一段資料或者程式強行駐留記憶體,稱之為記憶體常駐技術TSR。駐留資料可以供後續訪問,駐留程式可以適時啟動執行。每臺PC機都有640KB的使用者可用記憶體區,這片區域一般由作業系統自動地幫我們使用,也可以由使用者自己安排。

PC機提供主機與外設交換資訊的指令in和out,分別用於輸入和輸出一個8位位元組。支援對8259中斷控制器晶片、8255可程式設計外設介面晶片、8253計時器晶片的程式設計控制。可以達到寫程式控制外設工作的目的。

至於系統資料,PC機豐富極了,公佈系統資料也是IBM公司技術策略的一部分,允許應用程式訪問系統資料。位於記憶體低地址從0:400到0:5FFH的RAM是專用於BIOS、DOS以及應用程式的通訊區,系統引導時進行預設配置,但允許程式設計師改變。利用它們,可以獲得可用記憶體大小,從記憶體讀取時鐘資料,令系統快速熱啟動等。DOS在裝載一個程式執行時,要在記憶體為該程式建立一個叫程式段字首的資料結構PSP,它也是可以訪問的。我們曾經寫過一個螢幕時鐘程式,像大多數UNIX命令那樣,以命令列方式執行。程式可以從互動啟動的任意時刻起,顯示一架以秒增值的時鐘,它就是通過訪問程式的PSP,獲得命令列引數實現的。

PC環境下還提供對硬碟進行分割槽的程式fdsk,提供對分割槽格式化程式format。支援對某個分割槽做格式化的同時,把作業系統程式裝配到適當的位置。載入程式是什麼樣的?它怎麼工作?可以用debug把它從磁碟指定位置反彙編出來閱讀。個人計算機的執行環境還可以經由BIOS做低階配置,也可以通過autoexec.bat用軟體的方式配置,早期就是這樣設定漢化環境的。

磁碟上也有種種系統資料提供讓我們瞭解磁碟物理結構、磁碟檔案結構、檔案目錄,從而管理和組織磁碟檔案。一片做了格式化的磁碟,其格式就被規格化了。編號最低的那個扇區,一定是引導扇區,接下去的若干個扇區用來存放第一個和第二個FAT表。引導扇區中在約定的位置上有一個基本磁碟參數列BPB和一個載入程式。讀出BPB就可以知道該磁碟容量多大,有多少個盤面,每個面有幾條磁軌,每條磁軌有多少扇區,作為檔案分配單位的簇佔幾個扇區,每個扇區幾個位元組等等。而一旦讀出FAT表,並藉助於它,就可以相繼地以簇為單位讀出每一個檔案的內容。而檔案的目錄在哪裡,目錄結構又是什麼樣子的,也都有明確的約定。這又給人們提供了玩磁碟檔案的廣闊天地。

使用者在微機面前,以往有的現在依然擁有,而且機器有了更快的速度和更大的儲存容量。比如多使用者機的大批命令,現在依然有。可以互動地啟動執行,也可以通過按鍵操作干預程式的執行。早期計算機直接對記憶體佈局,對運控的干預,對外設的控制,現在依然有這種權利,而且使用更方便了。微型機具備如此豐富的軟硬體使用和繼續開發環境,就取得了廣大電腦計算人的擁戴,讓他們有了用武之地,有了主人的自信。也容易吸引其他人群加入到使用微機的行列中來。

跟PC機打交道,自己有了很大的主動權,想執行什麼程式,把它找到拷貝至軟盤上,把軟盤放在軟碟機上,或者再拷貝到硬碟上,啟動指定程式執行就行了。工作環境寬鬆多了,對用機的時間地點沒有苛刻要求,也不用換拖鞋了。但是我們習慣於UNIX和VMS環境,發現DOS不保留命令的歷史,不像UNIX和VMS那樣可以回溯以前用過的命令,並可以有選擇地重複執行。缺少已有功能,每次都必須一個字元一個字元地輸入要執行的命令,使用很不方便。

在計算機家族裡,PC和MS-DOS都是小弟弟,它就陸續學習UNIX和VMS那些大哥哥,比如DOS 2.0版較以往的主要改進之處就是學習UNIX,建立磁碟上的檔案目錄樹,以樹形結構方式組織檔案目錄;部分地引入重定向和管道機制,允許在命令列中使用符號“>”和“|”等。但是MS-DOS沒有命令歷史機制,是一個缺點。當時我們也來幫助它,增添了命令的歷史機構。

實現命令歷史機制的基本思想是,寫一個新的命令解釋程式hcommand,它接收使用者命令,解釋執行命令。同時開闢一個儲存命令歷史的緩衝區,把剛執行的命令依次存入其中。當使用者發出命令“h”時,就把緩衝區存下來的命令加上順序號顯示在螢幕上,讓使用者可以用輸入“!!”的方式,重複執行上一條命令;輸入“! n”,重複執行此前的第n條命令。當然命令的實際執行還是交由DOS的命令解釋程式command去做,這樣才能事半功倍。DOS有功能呼叫2EH,提供了在次級執行command的功能,利用這一技術,可以把hcommand接收的命令交給原來的command執行。

只要把我們的hcommand寫入系統初啟時自動執行的批處理檔案autoexec.bat,整個系統將以新的hcommand作為操作環境,實現了命令歷史機制。在我們寫這個程式時, DOS還沒有這種機制。而我們自己的PC,已經是一種有UNIX命令歷史機制的DOS。1992年5月6日的《計算機世界》報上,我們發表“為DOS增設命令的歷史機構”一文,介紹了技術方案,給出了原始碼。命令快取和歷史地執行命令部分,用PASCAL語言編寫,在次級啟動執行命令解釋程式的2EH功能呼叫部分則是用匯編語言寫的。

上述工作對於DOS只能說是小的錦上添花,還很可能沒有被DOS的開發者們注意到。但作為我們自己,能夠跟得上當時流行的作業系統,欣賞它的優點,為我所用。同時評論其不足,並利用其公開的技術,改進它,也很有樂趣。

後來的MS-DOS高版本,才有一個doskey實用程式提供這種機制讓人選用。它既支援如上所述的UNIX方式的歷史機制,也支援VMS方式的歷史機制。後者採用鍵盤上的游標鍵,逐條地回溯執行過的命令歷史,一旦所要的命令被重新調出來,顯示於螢幕的命令區,用Enter鍵就可以執行命令。

技術公開讓這個行當的人可以有所作為。在微機稱雄的十幾年,特別是後來聯網後,許多應用被開發出來。下面是我身邊同事的一些例子,可以看作是廣大計算機從業人員在微機應用大潮中的一些浪花。

由於單位的性質,有的是為鐵路建設服務的專案。比如張龍祥教授曾經為昆明鐵路局開發了鐵路工程建設管理系統;易興忠老師開發了懷化南站駝峰訊號裝置微機監測系統。

由張龍祥教授、龍軍教授等承擔的,為省科委開發的科技專案成果登記與評獎系統,不但被湖南省科委採用,還曾經被國家科技部採用,用於國家科學技術獎的評定管理。

曾巧明副教授針對會計專業學生,開發了電算會計實習系統。本來學生們最好到企業實習,但是企業財會人員為了資料安全和保證財務工作不受影響,一般無法接收學生實習,存在矛盾。他在微機上構建了一個模擬的企業,種種財務資料一應俱全,有對應的資料庫,學生在其上可以按照國家現行財務制度,開展各種業務,生成所需的財務報表。學生們在校有了這種實踐平臺,畢業後就很容易上崗工作了。湖南省財政廳為該專案做了專家的驗收鑑定,確認系統符合財會制度。在這個基礎上,曾老師開辦了主打財會教學軟體的公司。

張修如副教授針對社會上小廣告氾濫,做了一個命名為“呼死你”的軟體。輸入小廣告上提供的電話號碼,程式會不斷地向該號碼呼叫,直到對方受不了。你想干擾別人嗎,自己先試試被干擾的滋味吧。迫使對方停止使用。

同事張偉博士,針對企業做實時生產資訊收集和企業資訊管理,也做到了小有規模的IT公司。

還有把微機應用於醫療行業的。易興忠老師利用條件模糊關係,構建了傷寒論的症狀和辨證原則知識庫,設計了終端互動操作的傷寒論論斷治療系統(易興忠:條件模糊關係和中醫傷寒論智慧終端 《計算技術與自動化》1982年第4期)。

微機時代有影響的普及性專業報刊《計算機世界》報、《軟體報》等,都曾連篇累牘地刊登過許多有趣的程式。一些彙集這類程式設計和用機經驗的書籍也多有發行。比如用內建喇叭唱某支歌,用一個符號或者數字畫出蒙娜麗莎頭像,給出某個簡單的遊戲程式源程式等等。辦公室的同事,往往輸入到計算機中,除錯檢驗一番,或時有評論。當然後來多得檢驗不過來,甚至連看也看不完。

這個時期市面上還流行諸如家庭理財幫手,面向中小學生輔助學習軟體,互動體檢健康諮詢軟體,裁剪衣服的軟體,裝修設計軟體等等,無法一一列出。真是各顯奇才,百花盛開,計算技術發展與應用開始滲透到社會生產生活的方方面面。

能夠用程式去駕馭電腦是很愜意的事,起碼可以學習增長知識,並影響周圍學生。後來在我們的《面向系統的程式開發技術與實踐》一書(電子工業出版社)中,比較詳細地歸納了PC機可程式設計的軟硬體環境和系統資料,引述了幾十個在PC環境下開發的程式例項,其中有一些是學習UNIX相應程式功能在PC上開發的。這些程式包括鍵盤管理程式,螢幕時鐘程式,磁碟檔案的建立、複製、刪除程式,磁碟檔案按名搜尋程式,磁碟檔案順序化整理,以便讓空閒簇連續起來的程式,雙機經RS232序列通訊程式,在純西文機器(在我們做這件事時仍然大量存在)上實現支援部分漢字的程式。我們使用了上面介紹的PC機硬體、系統資料、作業系統介面等各個層面的開發技術。涉及組合語言、幾種高階語言以及高階語言與組合語言混合程式設計。這些程式沒有商用程式那麼完善,只不過作為學習和嘗試駕馭PC的實踐罷了。

(本文內容也可參看 彭民德《電子計算60年》第5章 電子工業出版社)

相關文章