Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как откопилировать 16-bit'ную программу на C? 
V
    Опции темы
Modder
  Дата 7.1.2010, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



Как откопилировать 16-bit'ную программу на C в Borland 5.02 или Microsoft Visual Studio 2005?
PM   Вверх
andrew_121
Дата 7.1.2010, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



это зависит. код покажи.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Modder
  Дата 8.1.2010, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



Вот одна из программ:
Код

#include <iostream.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <errno.h>

typedef struct _DPB_WR_
{
  char spec;
  unsigned head;
  unsigned track;
  unsigned sector;
  unsigned sectcnt;
  void _far *buffer;
} DPB_WR;

char buf[1000];
char buf1[80];
char count=0;

int main(void)
{
  union REGS reg;
  struct SREGS segreg;
  DPB_WR far *dbp_wr;
  int sectors, i;

  dbp_wr = (DPB_WR far*)farmalloc(sizeof(DPB_WR));

  if(dbp_wr == NULL)
  {
    return(-1);
  }

  dbp_wr->spec = 0;
  dbp_wr->head = 0;
  dbp_wr->track = 81;
  dbp_wr->sector = 0;
  dbp_wr->sectcnt = 1;
  dbp_wr->buffer = buf;

  reg.x.ax = 0x440d;
  reg.h.bl = 1;
  reg.x.cx = 0x0861;
  reg.x.dx =  FP_OFF(dbp_wr);
  segreg.ds = FP_SEG(dbp_wr);
  intdosx(&reg, &reg, &segreg);

  if(reg.x.cflag != 0)
  {
    clrscr();
    gotoxy(10,10);
    cout<<"Your license is out";
    return(-1);
  }

  count=buf[16];
  if (count == 0)
  {
   clrscr();
   gotoxy(10,10);
   cout<<"Your license is out";
  }
  else
  {
   clrscr();
   gotoxy(10,10);
   cout<<"Hello world";
   count--;
   buf[16]=count;


   dbp_wr->spec    = 0;
   dbp_wr->head    = 0;
   dbp_wr->track   = 81;
   dbp_wr->sector  = 0;
   dbp_wr->sectcnt = 1;
   dbp_wr->buffer  = buf;

   reg.x.ax = 0x440d;
   reg.h.bl = 1;
   reg.x.cx = 0x0841;
   reg.x.dx =  FP_OFF(dbp_wr);
   segreg.ds = FP_SEG(dbp_wr);
   intdosx(&reg, &reg, &segreg);

  }


  farfree(dbp_wr);

  return(0);
}

PM   Вверх
andrew_121
Дата 8.1.2010, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



http://rghost.ru/803567

но в вендовзе она работать не будет.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Modder
  Дата 8.1.2010, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



Качал уже кучу таких программок, но все равно не вышло.
Нашел способ с помощью Borland через командную строку
Код

C:\BC5\BIN>bcc program.cpp
Но все же хотелось узнать как это сделать через интерфейс виндузной программы.

И еще вопрос, можно ли такого рода программку без заморочек перевести на 32-bit?
PM   Вверх
andrew_121
Дата 8.1.2010, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(Modder @  8.1.2010,  02:16 Найти цитируемый пост)
все равно не вышло.

у меня скомпилилось в первого раза.


Цитата(Modder @  8.1.2010,  02:16 Найти цитируемый пост)
Но все же хотелось узнать как это сделать через интерфейс виндузной программы.

поясните.


Цитата(Modder @  8.1.2010,  02:16 Найти цитируемый пост)
можно ли такого рода программку без заморочек перевести на 32-bit? 

нет.
эта, скомпиленная 16-ти битным компилятором, не может работать в вендавз, про остальное и говорить не чего...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Modder
Дата 8.1.2010, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



Цитата(andrew_121 @  8.1.2010,  02:47 Найти цитируемый пост)
поясните.

Т.е. откомпилировать виндузным компилятором (тем же Borland 5), пользуясь виндузным его интерфесом (не командной строкой как я предложил выше), а не досовским компилятором (типа Turbo C).


Цитата(andrew_121 @  8.1.2010,  02:47 Найти цитируемый пост)
эта, скомпиленная 16-ти битным компилятором, не может работать в вендавз, про остальное и говорить не чего... 

Я не это имел ввиду. Как исходный код переписать под 32-bit? Много переписывать? В чем отличия в коде? Почему 32-битным не компилируется? Я просто с этим не особо знаком.
PM   Вверх
andrew_121
Дата 8.1.2010, 03:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(Modder @  8.1.2010,  03:16 Найти цитируемый пост)
тем же Borland 5

я бы не назвал его вендозавским компилятором. это что-то между ms-dos и win-3.1


Цитата(Modder @  8.1.2010,  03:16 Найти цитируемый пост)
Как исходный код переписать под 32-bit?

для начала нужен 32-ух битный компилятор.
далее. в вашем коде используется доступ к регистрам процессора, и вызов прерываний ms-dos. если с первым еще можно справится, то последнее не возможно. одним словом, эта программа для ms-dos.
да и зачем она вам? судя по (reg.x.ax = 0x440d), программа что-то выполняет с диском. в венде такое не прокатит.


Цитата(Modder @  8.1.2010,  03:16 Найти цитируемый пост)
Много переписывать?

для начала, нужно понять что именно программа выполняет.


Цитата(Modder @  8.1.2010,  03:16 Найти цитируемый пост)
Почему 32-битным не компилируется?

потому что, этот код остался в прошлом, лет эдак 15-20 назад.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Modder
Дата 8.1.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



Хорошо. Смысл всего понял. И тогда еще один вопрос:

Цитата(andrew_121 @  8.1.2010,  03:46 Найти цитируемый пост)
в вашем коде используется доступ к регистрам процессора, и вызов прерываний ms-dos. если с первым еще можно справится, то последнее не возможно.

Почему в 32-bit невозможно реализовать вызов прерываний ms-dos?
PM   Вверх
xvr
Дата 8.1.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Modder @ 8.1.2010,  15:03)
Почему в 32-bit невозможно реализовать вызов прерываний ms-dos?

Потому что его (MS-DOS) там (в Win32) нет. MS-DOS'овские программы под Win32 запускаются в специальном эмуляторе, который перехватывает все вызовы MS-DOS (и вообще все команды int) и перенаправляет их в соотвествующие драйвера поддержки.

PM MAIL   Вверх
andrew_121
Дата 8.1.2010, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(xvr @  8.1.2010,  19:34 Найти цитируемый пост)
и перенаправляет их в соотвествующие драйвера поддержки.

и это(0x440d) виндовз не позволит выполнить.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
kogemrka
Дата 8.1.2010, 20:00 (ссылка)   | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.1.2010

Репутация: нет
Всего: нет



На самом деле прерывания в 32-битном режиме есть, но винда не позволит их вызвать. Дело в том, что в этом режиме (он называется защищённом) код исполняется в разных т.н.з. "кольцах защиты". Ядро операционной системы и драйверы работают в нулевом кольце - они могут обращаться к оборудованию напрямую и использовать прерывания. Прикладное ПО работает (как правило) в третьем кольце и может обращаться к "железу" только через абстракции (вызов функций ядра, например).

Чтобы портировать этот код вам нужно найти в справочнике прерываний, для чего предназначены вызовы, используемые в программах и заменить на вызов функций API, выполняющих ту же работу. "без заморочек" сделать это не получится
PM MAIL   Вверх
mes
Дата 9.1.2010, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



можно еще пойти с другой стороны и вместо переделки поискать готовый виндоыный аналог вашей программы..
Если она выполняла что то полезное, что и щас может пригодиться, то вроятность находки велика.
smile

Добавлено через 12 минут и 45 секунд
интересно на каком диске Вы собираетесь применять сию защиту.. Уж не на жеском ли ?
или неужто до сих пор существуют (в смысле используются) магнитные диски ?!  smile 
 smile 



--------------------
PM MAIL WWW   Вверх
Modder
Дата 9.1.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.1.2008

Репутация: нет
Всего: нет



mes, данная программа выполняет чтение 81-ой дорожки дискеты, считывает от туда счетчик количества запусков или установок какого-то ПО. Если счетчик не нулевой, то все хорошо и он уменьшается на 1. Типа ограниченное кол-во запусков)) Но под виндой она не работает, не выполняет операции чтения/записи:(  В dos'е все ок.
Цитата(mes @  9.1.2010,  03:51 Найти цитируемый пост)
неужто до сих пор существуют (в смысле используются) магнитные диски ?!

Как оказалось, используюстся:( Но только в образовательных целях)
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.