Добрый вечер. Есть два регистра (или две переменные Х и У). Нужно сделать так чтобы последние N бит переменной У стали первими N бит переменной Х, а остальные остались неизменными. Желательно к этому всему прикрутить генератор случайных чисел чтобы N было случайным числом (в пределах 32 ). Как это все делается?
Код (Text): ; ; EDX = variable X ; EAX = variable Y ; EBX = N bit ; ; ; CL = 32-N ; mov cl, 32 sub cl, bl ; ; Low N bits of Y into high bits of EDI ; mov edi, eax shl edi, cl ; ; Clear room for high bits in X ; mov cl, bl shr edx, cl shl edx, cl ; ; Finally! Set bits from EDI into X ; or edx, edi
Можно попробовать "rdtsc". Код (Text): rdtsc mov ecx,eax ;----------- mov edx,X mov ebx,Y shr edx,cl shld edx,ebx,cl
ofCros Результат rdtsc только в качестве зерна псевдослучайной последовательности. Сам по себе он нормального разброса не даст. Особенно в подряд идущем коде. Один из простейших вариантов получения следующего члена последовательности на основе предыдущего с более-менее приличным разбросом (уже упоминался на форуме):
А если я хочу поменять местами крайние части регистра (переменной) размером N (своего рода рокировка), то мне нужно ;edx = X ;ebx = Х ;cl = N shr edx,cl shld edx,ebx,cl shl edx,cl shrd edx,ebx,cl или нет?
Может я че напутал но в регистре 32 бита, если N равно 10 то я хочу поменять местами биты 1-10 на 22-32. Если N равно 4 то биты 1-4 на 28-32.
Обменять местами старшие биты Y и младшие X. Если так, то: Код (Text): ;edx = X ;ebx = Y ;cl = N mov eax,edx shr edx,cl shld edx,ebx,cl shl ebx,cl shrd ebx,eax,cl