首頁>Club>
29
回覆列表
  • 1 # ygccghcc

    為載入一個.COM程式,MS-DOS首先試圖分配記憶體,因為.COM程式必須位於一個64K的段,所以.COM檔案的大小不能超過65,024(64K減去用於PSP的256位元組和用於一個起始堆疊的至少256位元組)。如果MS-DOS不能為程式、一個PSP、一個起始堆疊分配足夠記憶體,則分配嘗試失敗。否則,MS-DOS分配儘可能多的記憶體(直至所有保留記憶體),即使.COM程式本身不能大於64K。在試圖執行另一個程式或分配另外的記憶體之前,大部分.COM程式釋放任何不需要的記憶體。分配記憶體後,MS-DOS在該記憶體的頭256位元組建立一個PSP,如果PSP中的第一個FCB含有一個有效驅動器識別符號,則置AL為00h,否則為0FFh。MS-DOS還置AH為00h或0FFh,這依賴於第二個FCB是否含有一個有效驅動器識別符號。建造PSP後,MS-DOS在PSP後立即開始(偏移100h)載入.COM檔案,它置SS,DS和ES為PSP的段地址,接著建立一個堆疊.為建立一個堆疊,MS-DOS置SP為0000h,若已分配了至少64K記憶體;否則,它置暫存器為比所分配的位元組總數大2的值.最後,它把0000h推進棧(這是為了保證與在早期MS-DOS版本上設計的程式的相容性)。MS-DOS透過把控制傳遞偏移100h處的指令而啟動程式.程式設計者必須保證.COM檔案的第一條指令是程式的入口點。注意,因為程式是在偏移100h處載入,因此所有程式碼和資料偏移也必須相對於100h.組合語言程式設計者可透過置程式的初值為100h而保證這一點(例如透過在原程式的開始使用語句org 100h). MS-DOS置SP為0000h??? 那麼“它把0000h推進棧”時直接就棧溢位了。:)

  • 中秋節和大豐收的關聯?
  • 天語手機的密碼鎖忘了怎麼辦?