Assembly Language Random Number Generator

14,369

The answer to your question is platform dependent, so you need to specifiy this, and we can help you in a more specific way.

But a common method in real-address-mode (e.g. MS-DOS) is to call an interrupt and send the data to the SO (Standard Output).

Example (the %macro keywords are preprocessor directives that NASM understands - but not all compilers use it, but I included it for clarity):

%macro printLn 1
        mov ah, 09h ; 9h means "write a string" on screen
        mov edx, %1
        int 21h ; call the ISR for MS-DOS Services
%endmacro        

[SECTION .text]

mystart:
        printLn string
        ret

[SECTION .data]
string  db      "This is a string of text", 13, 10, '$'

Another method might be to hook directly a C-Lib function and output that way.

You should refer to the ASCII Table for character codes.

Also remember, as drhirsch mentioned below, that if you intend to output integers, you will need to convert those values into a form that your ISR can handle, like hex equivalents. You will then need to write an additional function to "translate" the values. This question is a good example of what I am referring to.

Share:
14,369
Whiplash
Author by

Whiplash

Updated on June 06, 2022

Comments

  • Whiplash
    Whiplash almost 2 years

    I have recently started to learn assembly language. For a project I am working on I have to make a random number generator using linear congruence. I am suppose to take in three numbers. An upper bound, a lower bound and a number of how many random numbers I want. As for the formula for getting a random number I came up with....

    randomNumber = (seed % (upper-lower) + lower)

    I then tried to put this into code. I came up with this

    .data
      upper BYTE 100      ;setting upper limit 100
      lower BYTE 0        ;setting lower limit 0
      number BYTE 5       ;number of random numbers
    
    .code
    call main
    exit
    
    main proc
    
       cls    
       mov bx,upper            ;moving upper bound into bx
       mov dx,lower            ;moving lower bound into dx
       mov ax,2914017          ;taking a random number for this trial
       mov ecx,number          ;setting the loop counter
    L1:
       sub bx,dx               ;(upper-lower)
       div bx               
       add ah,dx               ;(randomNumber mod (bx) + lower
    
    main endp
    

    I am curious how I would print out the random number at the end of each loop cycle. And if the above code makes any sense.

    Thanks in advance!

  • Daniel Kamil Kozar
    Daniel Kamil Kozar about 12 years
    int 01fh? Are you sure you didn't mean int 21h?
  • Gunther Piez
    Gunther Piez almost 12 years
    You need to convert the number into ASCII before printing