2016-03-06 2 views
-1

Так что я писал код сборки в TASM. Но теперь я хочу перенести его в MASM и запустить его на 32-битной Windows. Могу ли я продолжать прерывание DOS или есть ли другой способ сделать это?Как я могу использовать прерывания DOS в 32-битной сборке Windows?

Я хочу, чтобы в идеале запустить это на Windows, 10.

+1

Что было бы важно знать, если вы собираетесь создавать настоящие приложения Win32 (поддерживаются консоль или графический интерфейс) или вы планируете просто запускать 16-разрядные программы DOS в Windows 10. Ответ на этот вопрос будет диктовать конечно, вам придется подумать. –

+0

Я хочу создавать приложения, которые могут запускаться в Windows без эмулятора или DOSBOX. – Ashara

+1

Включает ли это 16-разрядную подсистему NTVDM, которая эмулирует подпрограммы DOS/BIOS в 32-битных вариантах ОС Windows? Если вы не хотите использовать этот уровень эмуляции, предоставляемый 32-разрядными ОС Windows, вам придется уйти от написания 16-битных программ (что означает отказ от вызовов DOS/BIOS, к которым вы привыкли). В Интернете есть много учебников по написанию кода ассемблера для Win32 с использованием MASM. Google - ваш друг. –

ответ

0

16 битный код из Windows 95 будет по-прежнему работать на 32-битных окон, по крайней мере до тех пор, Windows 7 (у меня нет программного обеспечения, чтобы попробовать его на Windows 10).

Однако для 32-битного и 64-битного кода вы должны начать использовать win32 api, которые используют менее захватывающую инструкцию «вызов» вместо прерываний.

+0

Так что 32-битный код, сгенерированный с использованием TASM, тоже не будет работать? – Ashara

+0

@Ashara: Если TASM может собрать 32-битный код, то вы можете сделать что-нибудь с ним. Вам по-прежнему необходимо перенести свой код из API вызовов DOS 'int 21h' в API системных вызовов для системы, для которой вы хотите работать. Это не просто другой ABI для того же API; это реальные изменения в доступных системных вызовах. Возможно, вы захотите портировать прямо на 64-битную версию, и не потрудитесь делать 32-битную версию. IDK, как похожие системные вызовы Windows находятся между 32 и 64 бит. –

+1

@PeterCordes: MS недоверчиво относится к 'syscalls' напрямую по соображениям совместимости. Предпочтительный механизм заключается в том, чтобы делать вызовы опосредованно через системные DLL, такие как user32.dll, kernel32.dll, gdi32.dll и т. Д., Которые составляют API Win32. –

0

Простой ответ: нет. В Win32/Win64 вызов прерывания DOS приведет к сбою вашей программы с сообщением «Недействительная операция». Выясните, что вы пытаетесь сделать с прерываниями DOS (вывод в консоль? Записывать в файлы?), Найти соответствующие функции API Win32 и вызвать их.

ОБНОВЛЕНИЕ: зависит от того, что вы после. Прерывания DOS доступны только для исполняемых файлов DOS; Исполняемые файлы Windows должны использовать Windows API. Вполне возможно сделать исполняемые файлы Windows в сборке, включая MASM, но вам нужно будет изучить новые методы. Создание исполняемых файлов DOS поддерживается в более старых версиях MASM, но этот набор навыков довольно бессмыслен в современной вычислительной среде. Во-первых, подсистема DOS медленно, но верно уходит из Windows. У 64-разрядных версий Windows этого больше нет.

+0

Не совсем верно. В системах X86/WIn32 NTVDM выполнит много 16-разрядных программ DOS. Поддерживается большинство (не всех) прерываний DOS/BIOS. Единицы, которые не будут, как правило, подрывают безопасность. –

+0

MASM, которому принадлежит OP, больше не способен генерировать исполняемые файлы DOS. –

+0

На самом деле он не сказал, какая версия MASM. MASM 6.14/6.15 более чем способен генерировать 16-битный код. –

Смежные вопросы