Как я могу получить значение int 0x16?
У меня есть этот встроенный ассемблер в моем коде C:
asm volatile ("mov %ah, 01\n"
"int $0x16\n");
Этот код является версией ассемблера getch()
Это работает, но теперь я хочу получить значение, которое вернул этот встроенный ассемблер (в частности, я хочу знать ключ, который возвращает прерывание 16h).
Как я могу это сделать?
Изменить: я делаю MS-DOS COM файлы с использованием C и DosBox. В настоящее время все работает нормально, за исключением проблемы, которая у меня сейчас.
Полный код:
asm (".code16gcc\n"
"call dosmain\n"
"mov $0x4C,%ah\n"
"int $0x21\n");
static void print(char *string)
{
asm volatile ("mov $0x09, %%ah\n"
"int $0x21\n"
: /* no output */
: "d"(string)
: "ah");
}
int dosmain(void)
{
int a;
asm volatile ("mov %%ah, 0\n"
"int $0x16\n"
: "=r"(a));
print(a);
print("Hello, World!\n$");
return 0;
}
Но вызывает хороший "переполнение буфера?"
1 ответ
У вас есть проблема с цепочкой инструментов.
Версия GCC, которую вы используете, является 32-битным компилятором. Вставка asm(".code16gcc")
директива вверху изменяет поведение ассемблера, позволяя использовать 32-битные инструкции, но не информирует GCC о модели сегментированной памяти, используемой в реальном режиме. В сочетании с (неизвестными и, возможно, неправильными) шагами, которые вы используете для генерации .com
двоичный, результатом будет нерабочий исполняемый файл.
Если вы хотите создавать исполняемые файлы DOS, используйте набор инструментов, предназначенный для этой среды, например OpenWatcom.