Это не сработает. Предполагая, что ваша цель состоит в том, чтобы создать программу, которая может работать либо в простой DOS, либо в Windows, у вас есть несколько вариантов:
Самый простой вариант - использовать расширитель DOS HX , который позволяет запускать приложения, используя большое подмножество Win32 API под DOS. По сути, вы просто создадите приложение win32 как обычно, а затем запустите инструмент PEstub
на исполняемом файле, чтобы он мог работать под DOS. PEstub
работает, заменяя заглушку DOS на ту, которая вызывает HX для загрузки и запуска вашей программы win32. У этого подхода есть два недостатка:
Он работает только с процессором 386 или выше, так как без него невозможно запустить программу win32.
Вы должны будете распространять несколько дополнительных файлов; как минимум:
DPMILD32.EXE
- двоичный загрузчик PE (автоматически вызывается заглушкой DOS на вашем EXE)
DKRNL32.DLL
- эмулирует KERNEL32.DLL
DUSER32.DLL
- эмулирует USER32.DLL
Если вы не можете рассчитывать на то, что сервер DPMI уже активен (или не знаете, что это значит), вам лучше включить:
HDPMI.EXE
- Сервер DPMI (автоматически загружается DPMILD32, если сервер еще не загружен)
Заглушка DOS в исполняемом файле win32 - это та часть, которая обычно выводит сообщение в виде строки: «Ха-ха, сосунок, вы не можете запустить эту программу в своем маленьком DOS! Попробуйте вместо этого Windows 95!» когда вы запускаете программу Windows в DOS. Это не должно делать это, хотя; это может быть любой исполняемый файл MS-DOS в формате MZ: я видел самораспаковывающиеся zip-архивы, которые использовали его для извлечения в DOS, но с графическим интерфейсом в системах win32.
Это приводит нас к другому варианту: вы можете написать как приложение win32, так и его заглушку DOS, и указать компоновщику использовать вашу заглушку вместо стандартной. Например, если вы используете MSVC для создания приложения win32, вы должны использовать опцию link.exe / STUB . Я предполагаю, что вы можете выяснить, как создать MS-DOS .exe для самостоятельной передачи компоновщику. Этот подход также имеет два больших недостатка:
По сути, вам нужно написать две разные программы, хотя с осторожностью они могут обмениваться исходными файлами.
Вам необходимо создать исполняемый файл MS-DOS, что означает, что вам нужно либо использовать инструмент, который может их создать, либо хотя бы добавить какой-нибудь грязный шаблон к вашему коду ассемблера.