;============================================================================== ; randy2.asm ; Random Number Generator ;GENERATES PSEUDO-RANDOM INTERGERS IN THE RANGE LOWER TO UPPER ;INPUT: TWO STACK PARAMETERS - LOWER AND UPPER ENDS OF RANGE ;OUTPUT: AX-REGISTER CONTAINS RANDOM INTERGERS ;CALLING SEQUENCE: PUSH ; PUSH ; CALL RANDY ;============================================================================== .MODEL SMALL, BASIC ;============================================================================== ; D A T A S E G M E N T D E F I N I T I O N .DATA EXTRN SEED:WORD EXTRN randomNumber:WORD MULTIPLIER DW 25173 ;MULTIPLIER AND ADDEND DW 13849 ;ADDEND FOR MIXED ;LINEAR CONGRUENTIAL METHOD lower DW 0 upper DW 9999 range DW ? ;============================================================================== ; C O D E S E G M E N T D E F I N I T I O N .CODE ;ASSUME DS:randy_data reseed proc push ax push bx push cx push dx cmp bl, 1 jae given jmp clock given: mov seed, ax ;subprocedure use the supplied jmp exit clock: mov ah, 0 ;else use clock for seed value int 1ah mov seed, dx exit: pop dx pop cx pop bx pop ax ret reseed endp random proc push ax push bx push cx push dx PUSHF ;SAVE FLAGS ;MOV AX, SEG randy_data ;SET DS-REGISTER TO POINT ;MOV DS, AX ;TO LOCAL DATA SEGMENT mov ax, seed mul MULTIPLIER add ax, ADDEND ;calculate seed value mov seed, ax mov ax, upper sub ax, lower add ax, 1 mov range, ax ;range=upper-lower+1 mov ax, seed mul range add dx, lower mov randomNumber, dx ;randomNumber=(seed*range)mod(65536)+lower POPF ;RESTORE FLAGS pop dx pop cx pop bx pop ax ;RESTORE REGISTERS (ASSEMBLER ; GENERATES INSTRUCTIONS TO ; RESTORE REGISTERS - USES ret ;RETURN (randy2) random endp ;END random end