Настройки графики x86 asm для разрешений выше 640x480? - PullRequest
3 голосов
/ 10 сентября 2009

Я только начал использовать язык ассемблера (хотелось изучать что-то новое) и натолкнулся на несколько вопросов (пока), что все учебники, которые я просматривал, не отвечают или слишком стары, чтобы знаю.

1) Я пробовал несколько поисков (возможно, я просто не знаю правильных ключевых слов), но я не могу найти обновленный список графических режимов для изменения разрешения экрана и т. Д. Лучшее, что я нашел это: Учебник по ассемблеру , и я вряд ли думаю, что 640x480 - это лучшее разрешение на ассемблере. Кто-нибудь знает о более обновленном учебнике, который я могу использовать?

Редактировать: Прерывание 10 ч старое и не вполне поддерживает более 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, есть ли способ определить, какой графический режим использует пользователь в настоящее время, чтобы я мог изменить его и вернуть обратно после этого? (Я предполагаю, что есть, но не уверен, как это сделать.)

Редактировать: нужно запросить у ОС настройки графики.

Ответы [ 4 ]

4 голосов
/ 10 сентября 2009

С вопросами № 1 и № 3 обращайтесь к VESA BIOS Extensions . Это было чем-то вроде стандарта для работы с режимами "Super VGA", популярными в 90-х годах.

Что касается # 2, в целом ответ - нет, вы не можете перемещать память в память. Но это не совсем так: есть MOVS (строка перемещения), которая перемещает байт, слово или слово из DS: SI в ES: DI. Обычно эта инструкция используется вместе с префиксом REP для перемещения блоков памяти. Кроме того, предполагая, что у вас настроен стек, вы можете перемещать память в память, не забивая регистр, нажимая и выталкивая:

PUSH [mem1]
POP  [mem2]
2 голосов
/ 10 сентября 2009

Этот довольно подробный пост содержит много деталей о том, как использовать ассемблер для управления DirectX в Windows. В наши дни DirectX является ключевым семейством API для графики, поэтому вам не придется далеко ходить, используя прерывания эпохи DOS и программирование кадрового буфера VGA напрямую.

2 голосов
/ 10 сентября 2009

Что касается вашего первого вопроса, прерывание 10 очень старое и, вероятно, не используется за пределами разрешений 640x480. Теперь используется другая часть программного стека; то есть вам придется опросить Windows, чтобы получить текущее разрешение экрана.

1 голос
/ 04 ноября 2009

Прерывание 10h - это, по сути, вызов функции операционной системы (на самом деле он выполняет код BIOS). Внутренне он читает / записывает видеопамять, а также различные регистры на графической карте. Чтобы получить представление о том, что происходит "в течение" 10-часового прерывания, проверьте this out.

Когда вы запускаете программу DOS под Windows, она запускается на виртуальной машине DOS. На самом деле Windows не позволяет ей касаться видеокарты, но позволяет играть с виртуальной. Обычно это распространяется только на режимы экрана VGA (и иногда только текстовый режим), т. Е. У вас есть виртуальная VGA-карта (не современная графическая карта). По этой причине на 16-битном языке ассемблера в Windows вы просто не сможете использовать все возможности современных видеокарт.

Да, конечно, язык ассемблера позволяет вам делать все, что может делать видеокарта. Но только если либо:

  • ваша программа имеет неограниченный доступ к графическому оборудованию (например, вы пишете драйвер устройства для Windows или Linux, или работаете в чистом DOS или в вашем собственном ядре), или
  • ваша программа проходит через соответствующий интерфейс операционной системы.

Если вы все еще интересуетесь языком ассемблера, я бы посоветовал вам попытаться написать игрушечное ядро. Делая это, вы узнаете множество вещей.

Оставьте комментарий, если вам нужна дополнительная информация.

...