замена бит

Тема в разделе "WASM.BEGINNERS", создана пользователем rodger, 22 мар 2008.

  1. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    Добрый вечер. Есть два регистра (или две переменные Х и У). Нужно сделать так чтобы последние N бит переменной У стали первими N бит переменной Х, а остальные остались неизменными. Желательно к этому всему прикрутить генератор случайных чисел чтобы N было случайным числом (в пределах 32 ). Как это все делается?
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Код (Text):
    1. ;
    2. ; EDX = variable X
    3. ; EAX = variable Y
    4. ; EBX = N bit
    5. ;
    6.     ;
    7.     ; CL = 32-N
    8.     ;
    9.     mov cl, 32
    10.     sub cl, bl
    11.     ;
    12.     ; Low N bits of Y into high bits of EDI
    13.     ;
    14.     mov edi, eax
    15.     shl edi, cl
    16.     ;
    17.     ; Clear room for high bits in X
    18.     ;
    19.     mov cl, bl
    20.     shr edx, cl
    21.     shl edx, cl
    22.     ;
    23.     ; Finally! Set bits from EDI into X
    24.     ;
    25.     or  edx, edi
     
  3. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Код (Text):
    1.     ;edx = X
    2.     ;ebx = Y
    3.     ;cl = N
    4.       shr edx,cl
    5.       shld edx,ebx,cl
     
  4. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    Спасибо за ответы, пошел кодить, дай вам Бог здоровья.
     
  5. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Можно попробовать "rdtsc".
    Код (Text):
    1.      rdtsc
    2.       mov ecx,eax
    3.      ;-----------
    4.       mov edx,X
    5.       mov ebx,Y
    6.  
    7.       shr edx,cl
    8.       shld edx,ebx,cl
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ofCros
    Результат rdtsc только в качестве зерна псевдослучайной последовательности. Сам по себе он нормального разброса не даст. Особенно в подряд идущем коде. Один из простейших вариантов получения следующего члена последовательности на основе предыдущего с более-менее приличным разбросом (уже упоминался на форуме):
     
  7. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    А если я хочу поменять местами крайние части регистра (переменной) размером N (своего рода рокировка), то мне нужно
    ;edx = X
    ;ebx = Х
    ;cl = N
    shr edx,cl
    shld edx,ebx,cl
    shl edx,cl
    shrd edx,ebx,cl
    или нет?
     
  8. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Что значит крайние, старшие или младшие биты ?
     
  9. rodger

    rodger New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2007
    Сообщения:
    363
    Может я че напутал но в регистре 32 бита, если N равно 10 то я хочу поменять местами биты 1-10 на 22-32. Если N равно 4 то биты 1-4 на 28-32.
     
  10. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Обменять местами старшие биты Y и младшие X.
    Если так, то:
    Код (Text):
    1.     ;edx = X
    2.     ;ebx = Y
    3.     ;cl = N
    4.       mov eax,edx
    5.       shr edx,cl
    6.       shld edx,ebx,cl
    7.  
    8.       shl ebx,cl
    9.       shrd ebx,eax,cl