簡體   English   中英

在64位Windows上使用16位匯編程序?

[英]16-bit Assembly on 64-bit Windows?

我決定不久前開始學習匯編,所以我開始使用FASMW進行16位匯編。 但是,最近我有一台真正的新計算機運行Windows 7 64位,現在該程序組裝的已編譯.COM文件都不再起作用。 他們給出一條錯誤消息,指出.COM與64位Windows不兼容。 32位程序集仍然可以工作,但是我寧願從16開始並按自己的方式工作...是否可以在Windows 7上運行16位程序? 還是有一種特定的方式來編譯它們? 還是我應該放棄並跳到32位?

無法使用16位匯編的原因是因為16位子系統已從所有64位版本的Windows中刪除

解決此問題的唯一方法是安裝DOSBox之類的東西,或安裝VirtualBox之類的虛擬機軟件包,然后在其中安裝FreeDOS。 這樣,無論如何您將獲得真正的DOS。 NTVDM不是真正的DOS

就個人而言,我會鼓勵為DOS編寫16位程序集嗎? 不。我會使用32位甚至64位匯編程序-原因是針對不同的操作系統(稱為ABI)存在一組不同的函數調用。 因此,用於64位linux應用程序的ABI與32位應用程序不同。 不知道Windows是否如此。 但是,我保證中斷的含義可能有所不同。

此外,使用16位匯編程序還需要考慮各種因素,例如正在使用的內存模型。 我可能是錯的,但是我相信DOS可以為您提供64K的內存來玩“就是這樣”。 據我了解,所有內容,整個堆和堆棧以及代碼都必須適合此空間,這使您想知道任何事情實際上是如何工作的。

我的建議是只編寫32位代碼。 雖然最初看起來似乎應該學習如何編寫16位代碼,然后再“學習”為32位代碼,但實際上我會說相反,這是事實:編寫32位代碼實際上更容易因為相當多的任意體系結構約束(例如,關於可以用作基址寄存器的約束)基本上都用32位代碼處理了。

就此而言,我認為是否存在真正的理由來編寫16位x86代碼確實存在很大的疑問。 對於大多數實際用途來說,它是一個死掉的平台-對於台式機來說,它已經嚴重過時了;對於嵌入式計算機,您更有可能看到諸如ARM或Microchip PIC之類的東西。 除非您有特定的目標,並且肯定要知道它將是16位x86,否則我可能會忘記它的存在,就像世界上大多數其他國家一樣。

默認情況下,32位Windows 7和更早版本包含/啟用NTVDM。 在32位Win8 +上,可以在Windows功能中啟用它

在64位Windows(或任何其他64位操作系統)上,您需要仿真器或完全虛擬化。

長模式下的內核不能使用vm86模式提供虛擬8086實模式環境。 這是AMD64 / x86-64體系結構的局限性。

在運行64位內核的情況下,CPU以16位模式本機運行的唯一方法是16位保護模式(是的,這是存在的;不,沒有人使用它,並且AFAIK主流OS無法提供一種方法來實現)。用它)。 或者讓內核將CPU從長時間模式切換回傳統模式,但64位內核則不這樣做。

但是實際上,借助硬件虛擬化(VirtualBox,Hyper-V或使用Intel VT-x或AMD SVM的任何軟件),無論該VM是否以16位實模式運行, 64位內核都可以作為整個虛擬機的管理程序。或運行32位操作系統(例如Windows 98或2000),然后可以使用vm86模式運行16位實模式可執行文件。

尤其是在64位內核上, 完全模擬16位PC(就像DOSBOX一樣)通常更容易 ,而不是使用硬件虛擬化來本地運行常規指令,而是捕獲直接的硬件訪問( in / out ,加載/存儲到VGA內存等)以及可以進行DOS系統調用/ BIOS調用/任何操作的int指令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM