Перенести часть битов между числами с помощью сдвигов
Из чисел 12345678h и 90abcdefh нужно получить 90ab56efh.
В этом примере кода мы получаем 95678defh, как получить 90ab56efh?
format PE64 console
entry start
section '.data' data writable
bit_str1 dd 12345678h ;90ab56ef
bit_str2 dd 90abcdefh
section '.text' code executable
start:
mov eax, [bit_str1] ;12345678
mov ebx, [bit_str2] ;90abcdef
rol ebx,4 ;0abcdef9
rol eax,16 ;56781234
shld ebx,eax,16 ;def95678
rol ebx,12 ;95678def
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
Есть два числа: 12345678 (в регистре eax) и 90abcdef (в регистре ebx).
Нужно из первого вытащить 56 и воткнуть вместо cd во второе число.
- Крутим первое число, так чтобы
56оказалось слева (на край, чтобы потом при сдвиге двух чисел его переместить в другое число):rol eax, 16 ; должно получиться 56781234 - Крутим второе число, так чтобы заменяемое
cdоказалось тоже слева (опять же, на край, чтобы потом при сдвиге влево оно уехало из числа)rol ebx, 16 ; должно получиться cdef90ab - Дальше сдвигаем два числа вместе влево, чтобы
56переехало из первого числа во второе, аcdиз второго числа уехало (из-за переполнения разрядов числа); До операции: cdef90ab 56781234 shld ebx,eax,8 ; После операции: ef90ab56 78123400 - Крутим второе (левое в предыдущей операции) число, так чтобы
56оказалось на правильном месте:rol ebx, 8 ; должно получиться 90ab56ef