| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > аналог паскалевского random |
| Автор: archs 19.5.2002, 09:28 |
| Привет Народ Подскажите пожалуйста какая функция какого досового прерывания генерит произвольное число (если такая возможность имеется) Пасибки |
| Автор: Chingachguk 19.5.2002, 10:12 |
| Нет такой функции в дос ! Есть функция int 21h: mov ah,02ch ; Read current time int 21h ; CALL DOS ; cx:dx - текущее время, dl = 1/100 part of sec Можно примерно использовать число сотых секунды, возвращаемое ей. Можно также читать слово в памяти по определенном адресу в памяти: push ds push 0040h pop ds mov ax,word ptr ds:[006ch] ; Read current BIOS ticks (в ax) pop ds mov Seed,ax ; Запомнить его Это ДВОЙНОЕ слово(тут читалась его младшая часть) постоянно изменяется BIOS - таймером с высокой частотой(порядка 18,2 раза в секунду). Обычно генератор случайных чисел состоит из его инициализации достаточно случайным числом(в паскале это делает ф-ция randomize) - для того, чтобы первый вызов всегда возвращал РАЗНЫЕ значения, и, собственно, дальнейших вызовов. Вот пример кода простого генератора(это процедуры для формата tiny - *.COM): Random proc near ; Получить случаное число в интервале 0..MaxRandom (в стеке) ; Результат вернуть в регистре ax push bp mov bp,sp pusha mov ax,Seed mov cx,8 @NewBit:mov bx,ax and bx,002dh xor bh,bl clc jpe @shift stc @shift: rcr ax,1 loop @NewBit mov Seed,ax mov ah,0 xor dx,dx mov bx,[bp+4] ; bx = Максимально допустимое число add bl,1 adc bh,0 div bx mov [bp+4],dx popa mov ax,[bp+4] ; Результат вернем в виде слова pop bp ret 2 Random endp Randomize proc near ; pusha ; mov ah,02ch ; Read current time ; int 21h ; CALL DOS ; mov word ptr Seed,dx ; popa ; retn push ds push 0040h pop ds push word ptr ds:[006ch] ; Read current BIOS ticks pop word ptr ss:Seed pop ds retn Randomize endp Вот так |
| Автор: archs 20.5.2002, 11:05 |
| Чингачгук Благодарю! |