Ассемблер - FAQ

From KolibriOS wiki
Jump to navigation Jump to search

Установить определенный бит

Иногда такое требуется в сисфункциях, как например 47. Рассмотрим случай:

EAX: Бит 5 установлен

Тогда пишем 6 нулей: 000000

Биты нумеруются справа налево, при чем с нуля, поэтому в нашем случае бит установим так: 100000

Потом переводим это число в шестнадцатиричное, например здесь https://numsys.ru/ . Получается 0x20, то есть

mov eax, 0x20

А теперь рассмотрим реальный пример на уже упомянутой сисфункции 47:

  • ebx = параметры преобразования числа в текст:
  • биты 16-21 = сколько цифр отображать
  • биты 22-29 зарезервированы и должны быть установлены в 0
  • бит 31 установлен = не выводить ведущие нули числа

Да, есть и другие параметры, но я вынес только те которые нам "нужны".

Выписываем нули: выписать нужно максимальныйБит+1, в нашем случае 32: 00000000000000000000000000000000. Зарезервированные биты у нас уже обнулены; а вот 31 бит нам нужно установить, значит: 10000000000000000000000000000000. Теперь следует установить количество цифр. Например 5. Переводим в двоичное: 101. Сказано: биты 16-21. Визуализируем их: 1000000000[000000]0000000000000000. Значит в это промежуток нужно вставить 101: 1000000000[000101]0000000000000000 (распологать нужно правее, а остальное заполнить нулями). (Если ещё какие то биты надо установить, то их тоже устанавливаем, но в данном случае они не нужны). Переводим в шестнадцатиричную систему: 0x80050000

Все, готово:

mov ebx, 0x80050000

x*65536+y - как получить x и y?

Пример: сисфункция 37 - получение координат мыши. Здесь проще: x получается так:

shr eax, 16

y:

and eax, 0x0000ffff

(http://board.kolibrios.org/viewtopic.php?f=2&t=684&p=69834#p69834)