我接到了一個任務,為8086. 我希望保持簡單,現在只組裝小程式。我發現.COM格式很簡單。但是我找不到檔案格式的細節。
我還讀到執行總是從100h. 那么如果MS-DOS(實際上DOSBOX在我的情況下)系統程式已經存在,這不是問題嗎?我需要在0h-100h部分提供一些默認的存根代碼嗎?
我只是想知道我將如何撰寫.COM可在DOSBOX.
uj5u.com熱心網友回復:
該.COM格式沒有結構,它是一個扁平的二進制檔案。
程式(整個檔案)被加載到100h某個段中的地址。在此之下,您會找到適合您的程式的 PSP。段中的最后一個可用字(通常在 offset 處fffeh)將被覆寫0000h并指向它的堆疊指標。這允許您通過ret指令退出程式。
DOS的程式加載器設定所有的CS,DS,ES,和SS你的程式的部分。然后,DOS 內核跳轉到地址0100h(即程式的開始)來運行它。(從技術上講,程式加載器在cs執行 farjmp或iretto the之前不會設定cs:100h;如果它CS更早設定,則任何IP值都將在新程式的記憶體中,而不是在 DOS 內核中。)
這就是它的全部內容。您的程式根本不必關心分段,只要“微小”記憶體模型的扁平 64K 足以用于從檔案加載的所有靜態代碼 資料、頂部堆疊以及介于兩者之間的任何記憶體作為 BSS 或“堆”。任何段基的作業原理都是相同的,因此例如[bx],[bp]即使bp暗示ss:和bx暗示,也尋址相同的線性地址ds:。
請注意,因為 DOS 內核為您的程式選擇了一個段,所以它不會與任何已加載的程式或 DOS 內核發生沖突。它會按預期作業。
至于撰寫 COM 程式,我建議使用像 NASM 這樣的匯編程式,輸出格式為“二進制”(即無輸出格式)。一般模板是這樣的:
org 100h # Tell NASM that the binary is loaded to 100h
start: ... # the program starts here. This must
# be the first thing in the file.
# place any variables or constants after the code
然后組裝
nasm -f binary -o program.com program.asm
有關更多資訊,此資源可能對您有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/391741.html
上一篇:lc3的虛擬機
下一篇:用于鎖定或的C內置或行內匯編
