Перенести часть битов между числами с помощью сдвигов

Из чисел 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 во второе число.

  1. Крутим первое число, так чтобы 56 оказалось слева (на край, чтобы потом при сдвиге двух чисел его переместить в другое число):
    rol eax, 16  ; должно получиться 56781234
    
  2. Крутим второе число, так чтобы заменяемое cd оказалось тоже слева (опять же, на край, чтобы потом при сдвиге влево оно уехало из числа)
    rol ebx, 16  ; должно получиться cdef90ab
    
  3. Дальше сдвигаем два числа вместе влево, чтобы 56 переехало из первого числа во второе, а cd из второго числа уехало (из-за переполнения разрядов числа)
    ; До операции: cdef90ab 56781234
    shld ebx,eax,8
    ; После операции: ef90ab56 78123400
    
  4. Крутим второе (левое в предыдущей операции) число, так чтобы 56 оказалось на правильном месте:
    rol ebx, 8 ; должно получиться 90ab56ef
    
→ Ссылка