Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как откопилировать 16-bit'ную программу на C?


Автор: Modder 7.1.2010, 23:31
Как откопилировать 16-bit'ную программу на C в Borland 5.02 или Microsoft Visual Studio 2005?

Автор: andrew_121 7.1.2010, 23:45
это зависит. код покажи.

Автор: Modder 8.1.2010, 01:14
Вот одна из программ:
Код

#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);
}

Автор: andrew_121 8.1.2010, 01:50
http://rghost.ru/803567

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

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

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

И еще вопрос, можно ли такого рода программку без заморочек перевести на 32-bit?

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

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


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

поясните.


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

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

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

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


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

Я не это имел ввиду. Как исходный код переписать под 32-bit? Много переписывать? В чем отличия в коде? Почему 32-битным не компилируется? Я просто с этим не особо знаком.

Автор: andrew_121 8.1.2010, 03:46
Цитата(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 назад.

Автор: Modder 8.1.2010, 15:03
Хорошо. Смысл всего понял. И тогда еще один вопрос:

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

Почему в 32-bit невозможно реализовать вызов прерываний ms-dos?

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

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

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

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

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

Чтобы портировать этот код вам нужно найти в справочнике прерываний, для чего предназначены вызовы, используемые в программах и заменить на вызов функций API, выполняющих ту же работу. "без заморочек" сделать это не получится

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

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

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

Как оказалось, используюстся:( Но только в образовательных целях)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)