настройки графики x86 asm для разрешений выше 640x480?
Вопрос
Я только начал использовать язык ассемблера (захотелось изучить что-то новое) и столкнулся с несколькими вопросами (пока), на которые не отвечают все учебные пособия, которые я просматривал, или они слишком старые, чтобы знать.
1) Я попробовал несколько поисковых запросов (возможно, я просто не знаю нужных ключевых слов), но я не могу найти обновленный список графических режимов для изменения разрешения экрана и т.д.Лучшее, что я нашел, это: Учебное пособие по ассемблеру, и я бы вряд ли подумал, что 640x480 - лучшее разрешение, которое может использовать язык ассемблера. Кто-нибудь знает о более обновленном руководстве, которое я могу использовать?
Редактировать:Прерывание 10h устарело и не поддерживает более 640x480
2) Возможно ли "переместить" значение из переменной в другую переменную, не перемещая его сначала в регистр?Пример:
jmp start
n1 dw 0
n2 dw 0
res dw 0
start:
mov n1,5
mov n2,6
mov res,n1
add res,n2
...etc...
Редактировать:Это невозможно.Вы не можете переходить из памяти в память без использования регистров.
3) Переходя к вопросу 1, есть ли способ определить, какой графический режим в данный момент использует пользователь, чтобы я мог изменить его и изменить обратно после?(Я предполагаю, что есть, но не уверен, как это сделать.)
Редактировать:Необходимо запросить настройки графики в операционной системе.
Решение
По вопросам № 1 и № 3 загляните в Расширения VESA BIOS . Это было чем-то вроде стандарта для работы с «Super VGA». режимы, популярные в 90-х.
Что касается # 2, в целом ответ - нет, вы не можете перемещать память в память. Но это не совсем так: есть MOVS (строка перемещения), которая перемещает байт, слово или слово из DS: SI в ES: DI. Обычно эта инструкция используется вместе с префиксом REP для перемещения блоков памяти. Кроме того, при условии, что у вас настроен стек, вы можете перемещать память в память, не загромождая регистр, нажимая и выталкивая:
PUSH [mem1]
POP [mem2]
Другие советы
Что касается вашего первого вопроса, прерывание 10 очень старое и, вероятно, не используется за пределами разрешений 640x480. Теперь используется другая часть программного стека; то есть вам придется опросить Windows, чтобы узнать текущее разрешение экрана.
Это довольно многословное сообщение содержит много подробностей о том, как использовать ассемблер для управления DirectX в Windows. В наши дни DirectX - это ключевое семейство API для графики, поэтому вам не нужно далеко ходить, используя прерывания эпохи DOS и программирование кадрового буфера VGA напрямую.
Прерывание 10h - это в основном вызов функции операционной системы (на самом деле оно запускает код BIOS).Внутренне он считывает / записывает видеопамять, а также различные регистры на видеокарте.Чтобы получить представление о том, что происходит "внутри" прерывания 10h, проверьте это вон.
Когда вы запускаете программу DOS под управлением Windows, она запускается на виртуальной машине DOS.Windows на самом деле не позволяет ему прикасаться к видеокарте, но позволяет ему играть с виртуальной.Обычно это распространяется только на режимы экрана VGA (а иногда и только на текстовый режим), т.е.то, что у вас есть, - это виртуальная VGA-карта (не современная видеокарта).По этой причине на 16-разрядном языке ассемблера под Windows вы просто не можете использовать все возможности современных видеокарт.
Да, конечно, язык ассемблера позволяет вам делать все, на что способна видеокарта.Но только в том случае, если либо:
- ваша программа имеет неограниченный доступ к графическому оборудованию (например,вы пишете драйвер устройства для Windows или Linux, или выполняетесь в чистом DOS, или в вашем собственном ядре), или
- ваша программа проходит через соответствующий интерфейс операционной системы.
Если вы все еще интересуетесь языком ассемблера, я бы посоветовал вам попробовать написать игрушечное ядро.Делая это, вы узнаете массу вещей.
Оставьте комментарий, если вам нужна дополнительная информация.