Это язык ассемблера, поэтому для этой операции нет одной инструкции. Есть несколько шагов. Вероятно, наиболее эффективный способ времени будет описан следующим образом. Первый шаг - сохранить значение, если вам нужно, так как остальная часть кода уничтожит его. Эти шаги являются немного неточным, но дать общий алгоритм:
- Сохранить оригинальный номер где-то (если вы хотите сохранить его)
- Повернуть влево 4 бита (инструкция ROL - биты перемещаются влево и заверните назад вокруг справа)
- Сохранить вращаемого значение
- маска низких 4 бита (и с $ F)
- Проверьте результат с тестовым значением
- Go сделать что-то, если они соответствуют
- Получить последнее повернутое значение
- Повторите 2-7 еще три раза (чтобы захватить оставшиеся 3 грызет в слове)
Давайте предположим, что значение, которое вы хотите проверить (1234h) находится в регистре AX, и ваше тестовое значение находится в DX. Тогда возможная программа может выглядеть так:
push ax ; save the original value
mov cx,4 ; set main loop count (how many nibbles we want to check)
mainloop:
rol ax,4 ; rotate left 4 bits [puts the top 4 bits into the low 4 bits]
mov bx,ax ; save the rotated value
and ax,000Fh ; mask off bottom 4 bits
cmp ax,dx ; check against our test value
je found ; jump if we found it
mov ax,bx ; retrieve the last rotated value for the next nibble check
loop mainloop ; decrement CX and loop if not zero
... do some things here for "not found" case
jmp done
found:
... do some things here for "found" case
done:
Что-то в этом роде. Существует ряд условий, которые необходимо указать, например, сохраняется ли исходное значение, что происходит, если совпадение найдено по сравнению с не найденным, и хотите ли вы сопоставить все вхождения или только одно. Выше сказано только, что было хотя бы одно совпадение. Он также показывает, как изолировать 4-битные фрагменты значения с помощью бит-операций.