компиляция программы для запуска в режиме DOS - PullRequest
8 голосов
/ 14 января 2010

Я пишу простую программу для запуска в режиме DOS. Все работает под эмулированной консолью в Win XP / Vista / Seven, но не в DOS. Ошибка говорит: this program caonnot be run in DOS mode. Интересно, это проблема флагов компилятора или чего-то большего.

Для программирования я использую Code :: Blocks v 8.02 с такими настройками для компиляции:

-Wall -W -педантика -педантика-ошибки

в Project \ Build options \ Настройки компилятора

Я пробовал чистый режим DOS, загрузку с cd, а также настройку DOS на виртуальной машине. Появляется та же ошибка.

Должен ли я включить еще несколько флагов компилятора? Какие-то конкретные 386/486 оптимизации?

UPDATE

Хорошо, я скачал, установил и настроил DJGPP. Даже решены некоторые проблемы с библиотеками и библиотеками. Еще есть два вопроса.

1) я не могу скомпилировать код, который вызывает _strdate и _strtime, я дважды проверил включения, поскольку MSDN говорит, что ему нужно time.h, но все равно ошибка говорит : _strdate was not declared in this scope, я даже пытался добавить std :: _ strdate, но тогда у меня 4, а не 2 ошибки, сохраняющие то же самое

2) 2-й код около gotoxy, это выглядит так:

#include <windows.h>

void gotoxy(int x, int y)
{
  COORD position;
  position.X = x; position.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}

ошибка говорит о том, что нет windows.h, поэтому я поставил его на место, но есть еще много ошибок, говорящих о том, что некоторые отсутствуют в windows.h, Я ПРЕДПОЛАГАЮ это не будет работать потому что эта функция строго для Windows, верно? Есть ли способ написать аналог gotoxy для DOS?

UPDATE2

1) решено с использованием time(); вместо _strdate(); и _strtime();, вот код

time_t rawtime;
struct tm * timeinfo;
char buffer [20];

time ( &rawtime );
timeinfo = localtime ( &rawtime );

strftime (buffer,80,"%Y.%m.%d %H:%M:%S\0",timeinfo);
string myTime(buffer);

Теперь он компилируется под DJGPP.

Update3

Еще нужно решить код, используя gotoxy - заменил его другим кодом, который компилируется (в DJGPP).

Спасибо всем за помощь. Просто узнал кое-что новое о компиляции (флаги, старые IDE, такие как DJGPP, OpenWatcom) и обновил память, заставив DOS работать: -)

Ответы [ 9 ]

7 голосов
/ 14 января 2010

Судя по всему, вы сейчас компилируете консольную программу Windows. Несмотря на то, что это консольная программа, ей все равно требуется Windows для запуска.

Чтобы скомпилировать программу для работы в реальном DOS, вам нужно найти (возможно, действительно старый) компилятор и (особенно) компоновщик, который нацелен на DOS и может создавать исполняемые файлы DOS MZ. Последним компилятором Microsoft, предназначенным для MS-DOS, был VC ++ 1.52c. Если память не изменяет, Borland продолжал нацеливаться на DOS несколько позже, вплоть до Broland C ++ 5 или около того.

Я полагаю, что если вы зайдете на сайт Digital Mars, у него все еще может быть доступен компилятор C ++, предназначенный для DOS. В противном случае вы застрянете, ища что-то старое и старое.

Изменить: просмотр других ответов напомнил мне о DJGPP и OpenWatcom. Приношу свои извинения за то, что не упомянул их ранее.

Имейте в виду, что с точки зрения C ++ Borland и Microsoft - действительно старые компиляторы - они вообще не делают пространства имен, а поддержка шаблонов варьируется от несуществующей в компиляторе Microsoft до посредственной в Borland. DJGPP - это в основном расширитель DOS, на который был перенесен gcc; степень его устаревания (или современности) будет зависеть от того, какая версия gcc задействована. Компилятор Digital Mars несколько более современный, чем Borland, если я не ошибаюсь, но Уолтер Брайт сейчас проводит большую часть своего времени, работая над D вместо C ++, поэтому компилятор C ++ на самом деле не конкурирует с gcc или MSVC, не говоря уже о чем-то вроде Comeau или Intel, основанном на интерфейсе EDG.

3 голосов
/ 14 января 2010

То, что вы называете «эмулируемой консолью», не имеет ничего общего с эмуляцией или DOS. Возможно, вы все еще генерируете 32/64-битные исполняемые файлы Windows, просто используя консольную подсистему.

Начните с изменения вашего компилятора на тот, который способен генерировать 16-битный код. Я почти уверен, что OpenWatcom все еще поддерживает 16-битную MZ-цель из коробки. IIRC DJGPP тоже, но я не уверен и не знаю, поддерживается ли он до сих пор.

Редактировать: около gotoxy, вы могли бы:

  1. Используйте PDCurses и не волнует, что используется внутри (хотя я думаю, что это INT10)
  2. Используйте прерывание 0x10 самостоятельно
  3. Запись непосредственно в память VGA на 0xB8000

Я никогда не разрабатывал для DOS, поэтому я не знаю, какой метод будет считаться лучшим. Третий, кажется, самый быстрый.

2 голосов
/ 14 января 2010

Обратите внимание: Компиляция MinGW для MS DOS

В основном, используйте DJCPP в качестве серверной части для Code :: Blocks.

1 голос
/ 24 сентября 2012

используйте gotoxy из библиотеки conio.h . (душ дружественный;))

#include <conio.h>
#include <stdio.h>

void main()
{
    gotoxy(5,5);
    printf("Printing at (5,5)");
}

Simple

Также проверьте документацию Borland

1 голос
/ 16 января 2010

Вы можете использовать заголовок gotoxy из conio.h, поставляемый с DJGPP.

1 голос
/ 14 января 2010

Я привык использовать DJGPP для компиляции вещей в простых ms-dos .. home page .

Это полный бесплатный пакет компиляторов, который должен работать без сбоев!

0 голосов
/ 01 октября 2017

ia16-elf , размещенный в Linux или Windows, имеет GCC 6.2 для связи файлов .COM.(Он размещается на Mac с использованием Winery и MinGW для оболочки bash и извлечения архива Windows).

Используйте DosBox (или Boxer на Mac), QEMU, VirtualBox для тестирования, а не перезагрузку реальной физической машины, которая вам нужнао.

0 голосов
/ 14 января 2010

В win32 exe есть заголовок заглушки dos, который отображает это сообщение при запуске на чистых душах. Вы должны скомпилировать его с помощью DOS-компилятора, например, Turbo C, или предоставить целевую табличную форму, если DOS входит в число блоков кода. Это проблема программного обеспечения, а не аппаратной платформы.

0 голосов
/ 14 января 2010

Вы хотите, чтобы ваш компилятор указывал на DOS. Я не знаю, как это сделать, извините, но, возможно, это послужит намеком на поиск в Google ...

Глядя на сайт Code :: Blocks, кажется, что ваша IDE может поддерживать различные компиляторы (GCC, MSVC ++ и другие). Итак, сначала выясните, какой компилятор вы используете. Затем проверьте документацию компилятора.

Как только вы узнаете, какой компилятор вы используете, вы можете перефразировать (уточнить) свой вопрос - я уверен, что кто-то здесь, на stackoverflow, узнает.

Согласно этой теме , кажется, что компилятор Open Watcom] 2 нацелен на dos. Кроме того, он поддерживается вашей IDE (Code :: Blocks).

Удачи!

...