Для этого ответа есть несколько предпосылок:
- Вы используете компилятор, который генерирует 16-битный код, поскольку вызовы DOS работают только в 16-битном режиме и
- Ваш компилятор получает понятие сегментов.
В этом случае это:
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
?