Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Чингачгук :)
Благодарю!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)