настройки графики x86 asm для разрешений выше 640x480?

StackOverflow https://stackoverflow.com/questions/1405749

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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, или в вашем собственном ядре), или
  • ваша программа проходит через соответствующий интерфейс операционной системы.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top