используя функцию 9 прерывания 21h в C ++ - PullRequest
0 голосов
/ 11 апреля 2010

функция 09h прерывает 21h dx = смещение текста, ds = сегмент текста

как я могу получить сегмент и смещение в C ++?

Ответы [ 3 ]

3 голосов
/ 11 апреля 2010

Для этого ответа есть несколько предпосылок:

  1. Вы используете компилятор, который генерирует 16-битный код, поскольку вызовы DOS работают только в 16-битном режиме и
  2. Ваш компилятор получает понятие сегментов.

В этом случае это:

char string [] = "Hello World$";
call_int21h_9 (&string);

где call_int21h_9 что-то вроде:

call_int21h_9 (FAR char *string)
// the FAR above is important and very compiler dependent, it tells the compiler
// that the pointer is a 32bit pointer (16 bit segment and 16 bit offset)
{
  mov ah,9
  lds dx,string ; this loads the DS:DX segment:offset from the value on the stack
  int 21h
}

В дополнение к этому есть несколько способов компилировать 16-битное приложение в зависимости от того, как сегменты установлены и используются. Двумя наиболее распространенными являются small и large (компилятор может назвать их как-то иначе):

  • Маленький: все сегменты имеют одинаковое значение, и общее количество данных + код <64k </li>
  • Large: весь код и данные существуют во многих сегментах, а код + данные <1Meg </li>.

Существуют другие макеты сегментов (одни данные, много кода; один код и много данных и т. Д.), И вам необходимо обратиться к документации компилятора, чтобы узнать, что доступно.

Конечно, вашей самой большой проблемой является получение 16-битного компилятора.

Почему бы просто не использовать cout или printf?

1 голос
/ 11 апреля 2010

Если вы находитесь в реальном режиме, это верхний и нижний 16-битный (соответственно) указатель FAR на данные.

Среды, в которых используются указатели реального режима и позволяют напрямую вызывать программные прерывания, в наши дни действительно редки. В любой современной ОС вы будете использовать оболочку пользовательского режима, которая генерирует инструкцию sysenter вместо int.

0 голосов
/ 19 апреля 2010
#include <dos.h>

FP_SEG(&var);

возвращает сегмент переменной

FP_OFF(&var);

возвращает смещение переменной

...