Ассемблер - FAQ: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
(Create asm faq page)
 
 
(2 intermediate revisions by the same user not shown)
Line 16: Line 16:
А теперь рассмотрим реальный пример на уже упомянутой сисфункции 47:
А теперь рассмотрим реальный пример на уже упомянутой сисфункции 47:
* ebx = параметры преобразования числа в текст:
* ebx = параметры преобразования числа в текст:
:* биты 16-21 = сколько цифр отображать
:* биты 22-29 зарезервированы и должны быть установлены в 0
:* биты 22-29 зарезервированы и должны быть установлены в 0
:* бит 31 установлен = не выводить ведущие нули числа
:* бит 31 установлен = не выводить ведущие нули числа
Да, есть и другие параметры, но я вынес только те которые нам "нужны".
Да, есть и другие параметры, но я вынес только те которые нам "нужны".


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


Все, готово:
Все, готово:
  mov ebx, 0x80000000
  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)

Latest revision as of 11:43, 28 February 2021

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

Иногда такое требуется в сисфункциях, как например 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)