Как вызывать прерывания DOS в программе C / C ++ с использованием Inline Assembly? - PullRequest
2 голосов
/ 26 апреля 2010

Мне нужно вызвать некоторые прерывания DOS (Services) из программы на C / C ++, я попробовал следующий встроенный код asm: (Читать символ)

int main()
{
asm(
 "movb $0x01, %ah;"
 "int $0x21"
 );
system("PAUSE");
}

Но это не сработало! Я хотел бы знать, что я здесь сделал неправильно! Также, если есть другой способ вызвать дос прерывания! Спасибо!

Ответы [ 2 ]

9 голосов
/ 26 апреля 2010

Вы можете использовать прерывания DOS только из программ DOS, поэтому для этой работы вам понадобится действительно древний компилятор C ++, такой как Visual C ++ 1.0 или 1.5, или Turbo C ++ / Borland C ++ с поддержкой до 4.5 или 5.0. Тогда вам придется исправить свой ассемблерный код - то, что вы написали, выглядит как синтаксис AT & T, но все компиляторы DOS, о которых я знаю, используют синтаксис Intel. В этом есть одно исключение: djgcc. Это древняя версия gcc, которая работает под расширителем DOS, поэтому она использует синтаксис AT & T и все еще поддерживает набор прерываний, подобных DOS (хотя вы действительно используете расширитель DOS, а не DOS как таковой).

Даже в этом случае программа будет работать только в системе, которая поддерживает программы DOS (и Microsoft быстро удаляет ее из окон - например, она отсутствует во всех 64-разрядных версиях Windows).

DOS достаточно устарел, поэтому писать новый код для него не имеет смысла. Если вы хотите прочитать такой ключ, напишите программу для Windows и используйте что-то вроде ReadConsoleInput.

Edit: Хорошо, если вы действительно хотите это сделать, очевидным способом будет выбрать DOS extender и перенести на него текущую версию gcc. Другой возможностью было бы выбрать компилятор, такой как OpenWatcom или Digital Mars , который все еще поддерживается и уже портирован на DOS-расширитель .

0 голосов
/ 27 апреля 2010

Вам может понадобиться эмулятор x86, например DOSBox , чтобы запустить этот код в Windows XP.

...