【古董技術】ms-dos應用程序的結構

制定一個MS-DOS應用程序計劃需要認真分析程序的大小。這種分析可以幫助程序員確定MS-DOS支持的兩種程序風格中哪一種最適合該應用程序。.EXE程序結構為大型程序提供了好處,因為所有.EXE文件之前都有額外的512字節(或更多)的文件頭。另一方面,以失去這些額外好處為代價,.COM程序結構不會使小型程序負擔這些額外文件頭字節的開銷。因為.COM程序在被EXE2BIN轉換之前一開始就是.EXE程序,并且在MS-DOS下應用程序編程的幾個方面在使用的程序結構不同的情況下仍然相似,因此對于準備編寫只有.COM程序的程序員來說,對.EXE結構的充分了解也是有益的。因此,我們將從討論.EXE程序的結構和行為開始,然后看一下.COM程序和.EXE程序之間的區別,包括.COM程序結構和內容的限制。

exe程序

.EXE程序相比于.COM程序在應用程序設計方面有幾個優勢。
選擇.EXE格式的考慮因素包括:

  1. 非常大的程序
  2. 多個段 覆蓋區
  3. 段和遠地址常量 長跳轉
  4. 將程序升級到MS OS/2保護模式的可能性

.EXE格式的主要優勢是由文件頭提供的。最重要的是,文件頭包含了使程序能夠進行直接段地址引用的信息—這是程序要超出64KB以上才能滿足的要求。
文件頭還告訴MS-DOS程序需要多少內存。這些信息可以防止系統分配給程序不需要的內存—這在未來升級程序以有效運行在MS OS/2保護模式下的情況下是很重要的考慮因素。
在詳細討論.EXE程序結構之前,我們將看一下.EXE程序的行為。
在這里插入圖片描述
截取自早期的微軟檔案

這張圖片展示了一個.EXE程序在內存中的示例,當MS-DOS首次交給程序控制時。該圖顯示了微軟首選的程序段排列方式。
在將控制權轉移到.EXE程序之前,MS-DOS會初始化內存的各個區域以及微處理器的幾個寄存器。以下討論解釋了在將控制權交給.EXE程序之前可以從MS-DOS期待的內容。

程序段標志psp

程序段標志(或者我也叫他前綴)(PSP)不是任何程序代碼的直接結果。相反,這個特殊的256字節(16段)內存頁是由MS-DOS在加載所有.EXE和.COM程序到內存時,在它們前面構建的。雖然PSP確實包含對新程序有用的幾個字段,但它主要作為CP/M的遺留物存在 - 微軟采用了PSP以便更輕松地將在CP/M環境下可用的大量程序移植到MS-DOS環境中。圖4-2顯示了組成PSP的字段。

PSP:0000H([舊熱啟動])PSP以8086系列INT 20H指令開始,程序可以使用該指令將控制權傳回MS-DOS。PSP在偏移00H處包含此指令,因為在CP/M下,這個地址是WBOOT(熱啟動/終止),而CP/M程序通常通過跳轉到該中斷來終止。這種終止方法不應在新程序中使用。請參見下面的終止.EXE程序。

PSP:0002H(分配給程序的最后一個段的地址)MS-DOS在PSP的偏移02H引入了一個字。它包含已分配給程序的內存塊后的段地址。這個地址應該僅用于確定分配給程序的內存塊的大小或結束位置;它不應被視為程序可以占用的自由內存的指針。在大多數情況下,這個地址不會指向空閑內存,因為任何空閑內存都已經被分配。
在這里插入圖片描述
這張圖片是微軟msdos4時期的
除非使用/CPARMAXALLOC開關鏈接程序,否則程序不會被分配到指定的內存。即使使用了/CPARMAXALLOC,MS-DOS可能會將程序安裝到與程序需求一樣大的內存塊中。行為正常的程序應該只通過提供的MS-DOS功能調用來獲取額外的內存。PSP:0005H(MS-DOS功能調用[舊bios中斷)偏移05H也是從CP/M中遺傳下來的。這個位置包含一個8086系列的遠程(段間)調用指令,用于調用MS-DOS的功能請求處理程序。(在CP/M中,這個地址是操作系統中斷,用于類似的目的。)這個向量不應該在新程序中用于調用MS-DOS。MS-DOS僅提供這個中斷以支持CP/M風格的程序,因此只能通過它支持CP/M風格的功能(00-24H)。

PS13:000AH-0015H(22H、231I和24H中斷向量保留)MS-DOS使用偏移OAH到15H來保存三個特定程序的中斷的內容。MS-DOS必須保存這些,因為它允許任何程序通過一個MS-DOS功能調用執行另一個程序(稱為子進程),當被調用的程序終止時返回控制給原始程序。因為當子程序終止時原始程序會恢復執行,所以MS-DOS必須為原始程序還原這三個中斷,以防被調用的程序改變了它們。涉及的三個向量包括程序終止處理程序(中斷22H)、Control-C/Control-Break處理程序(中斷23H)和關鍵錯誤處理程序(中斷2411)。MS-DOS將這些的原始執行內容保存在子程序的PSI’中,從偏移0A開始為程序結束處理程序、OM為Control-C/Control-Break處理程序,12H為關鍵錯誤處理程序。

PSP:002C1-1(環境段地址)在MS-DOS 2.0及更高版本中,偏移2CH處的字包含了程序所能找到的PSP中最有用的一部分信息——MS-DOS環境的第一個段地址。這個指針使程序能夠通過環境搜索任意由用戶使用SET命令放置在那里的配置或目錄搜索路徑字符串.

PSP008011默認的 DTA 位于 PSP 的整個后半部分(128 字節)。MS-DOS 將內存中的這一區域用作程序使用 FCB 風格文件訪問函數時的默認記錄緩沖區。再次,MS-DOS 是從 CP/M 繼承了這個位置。(MS-DOS 提供一個程序可調用以更改 MS-DOS 將用作當前 DTA 的地址的功能。請參閱微軟的參考之南《系統調用:中斷 211:函數 1ah》。)因為默認 DTA 在程序執行需要它的文件操作之前沒有任何作用,所以 MS-DOS 將命令尾置于此供程序檢查。命令尾包括用戶執行程序時在程序名稱之后輸入的任何文本。通常,ASCII 空格(20H)是命令尾中的第一個字符,但 MS-DOS 認識的任何分隔符都可以占據此位置。MS-DOS 從偏移量 81H 開始存儲命令尾文本,并始終在文本末尾放置一個 ASCII 回車(ODH)。為了提供額外幫助,它在偏移量 80H 處放置了命令尾的長度。這個長度包括最后的 ODH 之外的所有字符。例如,命令行:

c:》DOIT ASS V CAN

然后你再doit對應psp:80h的地方就有

	0A    20 41 53 53   20  56 20  43 41 4E   0c長度 空格  a s s     空格 v 空格 c a n     長度(去掉最后一個字節的)             (總長度,含自身)
  • 未完待續

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16521.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16521.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16521.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++第十七彈---string使用(下)

?個人主頁: 熬夜學編程的小林 💗系列專欄: 【C語言詳解】 【數據結構詳解】【C詳解】 目錄 1、標準庫中的string類 1.1、string類的常用接口說明 1.1.1、string類對象的修改操作 1.1.2、string類對象非成員函數重載 總結 1、標準庫中的…

牛客熱題:有效括號

📟作者主頁:慢熱的陜西人 🌴專欄鏈接:力扣刷題日記 📣歡迎各位大佬👍點贊🔥關注🚓收藏,🍉留言 文章目錄 牛客熱題:有效括號題目鏈接方法一&#x…

MySQL視圖教程(01):創建視圖

MySQL 創建視圖 在 MySQL 中, CREATE VIEW 語句用于創建一個數據庫視圖(View)。 MySQL 是一種常用的關系型數據庫管理系統,提供了 CREATE VIEW 語法,用于創建視圖(View)。視圖是一種虛擬的表&…

Mycat+Mysql搭建數據集群實現數據分片存儲

前言 MyCAT介紹 * 一個徹底開源的,面向企業應用開發的“大數據庫集群”; * 支持事務、ACID、可以替代MySQL的加強版數據庫; * 一個可以視為“MySQL”集群的企業級數據庫,用來替代昂貴的Oracle集群; * 一個融合內存緩存技術、Nosql技術、HDFS大數據的新型SQL; * 一個新穎…

QCC---DFU升級變更設備名和地址

QCC---DFU升級變更設備名和地址 這個很多人碰到這個疑問,升級了改不了設備名和地址 /******************************************************************************* Copyright (c) 2018 Qualcomm Technologies International, Ltd. FILE NAME sink_dfu_ps.c DESCRIPT…

2024.5.1學習記錄

1、代碼隨想錄:貪心刷題 2、react 高級使用( hoc render、props、函數組件、serState 傳送門等) 3、游山玩水

《拯救大學生課設不掛科第四期之藍橋杯是什么?我是否要參加藍橋杯?選擇何種語言?如何科學備賽?方法思維教程》【官方筆記】

背景: 有些同學在大一或者大二可能會被老師建議參加藍橋杯,本視頻和文章主要是以一個過來人的身份來給與大家一些思路。 比如藍橋杯是什么?我是否要參加藍橋杯?參加藍橋杯該選擇何種語言?如何科學備賽?等…

2023年信息素養大賽小學組C++智能算法復賽試題解析

2023年信息素養大賽小學組C++智能算法復賽真題 智能算法挑戰復賽小學組(總共4道題)T1. 判斷數字出現了幾次 【題目描述】 給定一個正整數 n,判斷從 1 到這個數本身的所有數中,一共出現了多少次數字k。 【輸入格式】 輸入共1行,包括一個正整數n和一個正整數k。(0<n<…

JavaEE之線程(7)_單例模式(設計模式概念、單例模式優點、懶漢、餓漢模式)

一、什么是設計模式&#xff1f; 單例模式是設計模式中較為常見的一種。那么&#xff0c;什么是單例模式&#xff1f; 設計模式&#xff08;Design Pattern&#xff09;都是一些相對優秀的解決方案&#xff0c;很多問題都是典型的、有代表性的問題&#xff0c;學習設計模式&am…

C#面:如果出現ASP.NET中的事件不能觸發可能由于什么原因造成

當 ASP.NET 中的事件不能觸發時&#xff0c;可能由以下幾個原因造成&#xff1a; 事件綁定錯誤&#xff1a;請確保事件正確地綁定到相應的控件上。在 ASP.NET 中&#xff0c;可以通過在前端代碼或者后端代碼中使用事件處理程序來綁定事件。如果事件沒有正確地綁定到控件上&…

為什么本科畢業后我堅定地選擇了就業而不是考研?

大家好&#xff0c;我是小布丁。今天來聊聊我為什么本科畢業后選擇了就業而不是考研。 在整個大學期間&#xff0c;我被親戚拷問最多的問題就是&#xff1a;準備考研嗎&#xff1f;相信很多大學生都遇到過這種情況吧。 如果你說準備還好&#xff0c;親戚大概率就不會問下去&a…

js計算字符串大小存儲所占字節數

在JavaScript中&#xff0c;計算字符串所占的大小&#xff08;占用的字節數&#xff09;并不直接&#xff0c;但可以通過一些方法間接得到。 我們需要知道一個前提&#xff0c;英文字母 lenght 和字節數是一樣的&#xff1a;都是1&#xff0c;而中文 lenght1&#xff0c;字節數…

golang sqlite主從數據同步插件開發

### golang sqlite主從數據同步插件開發思路 參考Mysql的主從同步機制&#xff0c;Mysql是產生binlog&#xff0c;然后把binlog日志同步到從服務上。 同理&#xff0c;我們按sql執行順序記錄所有的增刪改查的sql語句&#xff0c;然后調用接口把sql語句傳到從服務上執行。 數…

關于軟件設計模式的理解

系列文章 關于時間復雜度o(1), o(n), o(logn), o(nlogn)的理解 關于HashMap的哈希碰撞、拉鏈法和key的哈希函數設計 關于JVM內存模型和堆內存模型的理解 關于代理模式的理解 關于Mysql基本概念的理解 關于軟件設計模式的理解 文章目錄 前言一、軟件設計模式遵循的六大原則…

前端面試題日常練-day35 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末。 1. 以下哪個是使用jQuery選擇所有具有CSS類名"myClass"的元素的正確語法&#xff1f; a) $(".myClass") b) $("myClass") c) $("#myClass") d) $("…

FURNet問題

1. 為什么選擇使用弱監督學習&#xff1f; 弱監督學習減少了對精確標注數據的依賴&#xff0c;這在醫學圖像處理中尤為重要&#xff0c;因為高質量標注數據通常需要大量專業知識和時間。弱監督學習通過利用少量標注數據或粗略標注數據來訓練模型&#xff0c;降低了數據準備的成…

元組推導式

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用元組推導式可以快速生成一個元組&#xff0c;它的表現形式和列表推導式類似&#xff0c;只是將列表推導式中的“[]”修改為“()”。例如&#xf…

python深入解析字符串操作的八大神技

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、字符串的長度與切片 示例代碼 二、去除多余的空格 示例代碼 三、字符串的開頭與包含…

元組的創建和刪除

目錄 使用賦值運算符直接創建元組 創建空元組 創建數值元組 刪除元組 自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 元組&#xff08;tuple&#xff09;是Python中另一個重要的序列結構&#…

JavaScript 獲取 HTML 中特定父元素下的子元素

JavaScript 獲取 HTML 中特定父元素下的子元素 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>查找子元素示例</title> </head> <body><div id"parent"><p&…