Ассемблер - FAQ: Difference between revisions
Maxcodehack (talk | contribs) (Create asm faq page) |
Maxcodehack (talk | contribs) |
||
(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'''. (Если ещё какие то биты надо установить, то их тоже устанавливаем, но в данном случае они не нужны). Переводим в шестнадцатиричную систему: | Выписываем нули: выписать нужно максимальныйБит+1, в нашем случае 32: '''00000000000000000000000000000000'''. Зарезервированные биты у нас уже обнулены; а вот 31 бит нам нужно установить, значит: '''10000000000000000000000000000000'''. | ||
Теперь следует установить количество цифр. Например 5. Переводим в двоичное: 101. Сказано: биты 16-21. Визуализируем их: | |||
'''1000000000[000000]0000000000000000'''. Значит в это промежуток нужно вставить 101: '''1000000000[000101]0000000000000000''' (распологать нужно правее, а остальное заполнить нулями). | |||
(Если ещё какие то биты надо установить, то их тоже устанавливаем, но в данном случае они не нужны). Переводим в шестнадцатиричную систему: 0x80050000 | |||
Все, готово: | Все, готово: | ||
mov ebx, | 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)