| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Как сделать случайный выбор? на MASM |
| Автор: ЭтоопятьИрина 9.9.2006, 12:08 |
| Подскажите под MASM примерчик, пожалуйста: Как можно осуществить случайный выбор процедуры (В делфи это randomize) примерно так: a1 proc ... a1 enmdp a2 proc ... a2 endp a3 proc ... a3 endp start: call случайный выбор из a1 .. a3 invoke Exitprocess, 0 Спасибо, Ирина. |
| Автор: sgi1981 9.9.2006, 16:34 |
| Тебе надо искать готовый или написать собственный генератор псевдослучайных чисел в виде функции. Причем такой, которая в качестве одного параметра принимает максимально возможное псевдослучайное число, а минимально возможное - 0. Составить массив адресов случайно вызываемых подпрограмм, занести туда в элементы адреса точек входа в коды подпрограмм. Вызывать функцию генер. псевдослучайные числа с параметром {колич. элементов массива адресов - 1}. Причем дополнительно необходимо инициализировать генератор чисел и лучше всего значением от таймера компьютера или еще лучше от системных часов. |
| Автор: ЭтоопятьИрина 9.9.2006, 19:52 |
| блин... Добавлено @ 19:54 А почему не ноль а -1 ? Чтобы не вылезти за границы массива? |
| Автор: Damarus 9.9.2006, 20:11 |
Да. |
| Автор: ЭтоопятьИрина 10.9.2006, 00:33 |
| Блин, вот рабочий код где-то откопала. Но куда мне вставить else ? Не могу вообще тут понять... Кто-нибудь - добавте тут хотя бы основные комментарии, чтобы прояснить, что тут такое. и как его модернизировать мне? Я могу пока ещё только только с АПИ... Чистый асм для меня тяжело даётся... Помогите... .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data random_seed dd ? res dd 0 sFmt db '%u',0DH,0AH,0 sBuf db 10 dup(0) .code Random proc dwBase:dword push ebx mov eax,dwBase xor ebx,ebx imul edx,random_seed,08088405h inc edx mov random_seed,edx mul edx mov eax,edx pop ebx ret Random endp Randomize proc invoke GetTickCount mov random_seed,eax ret Randomize endp start: invoke Randomize invoke Random,56 mov res,EAX invoke wsprintf,ADDR sBuf,ADDR sFmt,res ; или можно юзать макросы dwtoa,str$,etc invoke MessageBox,0,ADDR sBuf,0,0 invoke ExitProcess,0 end start |
| Автор: sgi1981 10.9.2006, 03:07 | ||
|
| Автор: ЭтоопятьИрина 10.9.2006, 04:58 |
| Спасибо, дорогой Сквай. ты уж очень подробно изложил... Кое-что я и сама знаю - например end start: это я знаю... :-) Вообще здорово ты всё это знаешь - молодец. Можно мне к тебе если что за советом обращаться лично? |
| Автор: sgi1981 10.9.2006, 07:04 | ||||
Всегда рад.
Да. Меня звать Сахаров Григорий Иванович. E-mail gis1981@yandex.ru ICQ 194-333-217 Сайт http://sgi.bigtruck-canada.ca/ С удовольствием... |
| Автор: dumb 11.9.2006, 03:57 | ||
эта чувствительность к регистру в символах... |
| Автор: mur 11.9.2006, 18:45 | ||
| Код который ты нашла изрядно захламлён в нём ebx зачем-то сохраняется, обнуляется и ... не используется А лучше так (один из вариантов):
|
| Автор: sgi1981 12.9.2006, 00:46 | ||
to mur: Не буду спорить, насколько корреляция меньше будет у псевдослучайных чисел в вашем случае, но инструкция div ebx выполняться может в среднем за 15 тактов АЛУ. Избегать div там где это возможно. |
| Автор: mur 12.9.2006, 07:22 | ||
| На счёт div согласен, внёс поправку !!! А на счёт корелляции:
у Вас рассмотрен другой частный случай 08088405h и 1 По хорошему корелляцию нужно каждый раз тестировать, но приятно, что на одном движке можно строить целую кучу разных генераторов! |
| Автор: ЭтоопятьИрина 12.9.2006, 17:56 |
| Спасибо, Сквай, за помощь. Написала тебе личное письмо. |
| Автор: mur 13.9.2006, 22:19 |
| Ответы на многие вопросы найдёшь в http://rain.ifmo.ru/~sapunkov/downloads/zubkov.zip, в частности раздел 5.7.1 про генераторы случайных чисел |