Ассемблер - FAQ: Difference between revisions
Maxcodehack (talk | contribs) (Add numbers count) |
Maxcodehack (talk | contribs) (Add 37 sysfn) |
||
Line 28: | Line 28: | ||
Все, готово: | Все, готово: | ||
mov ebx, 0x80050000 | mov ebx, 0x80050000 | ||
==x*65536+y - как получить x и y?== | |||
Пример: сисфункция 37 - получение координат мыши. Здесь проще: | |||
x получается так: | |||
shr eax, 16 | |||
y: | |||
and eax, 0x0000ffff |
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