2016-11-19 77 views
2

我使用程序集8086emu,我需要一個8位數的數字發生器。 我試圖@johnfound使用這段代碼:程序集隨機數發生器

RANDGEN:   ; generate a rand no using the system time 

RANDSTART: 
    MOV AH, 00h ; interrupts to get system time   
    INT 1AH  ; CX:DX now hold number of clock ticks since midnight  

    mov ax, dx 
    xor dx, dx 
    mov cx, 10  
    div cx  ; here dx contains the remainder of the division - from 0 to 9 

    add dl, '0' ; to ascii from '0' to '9' 
    mov ah, 2h ; call interrupt to display a value in DL 
    int 21h  
RET  

,但只有當你產生1號是有用的。 我試圖創建僞隨機函數,但我很新的程序集,我沒有成功。 我想知道是否有翻譯Java的Math.random()功能什麼的simular彙編8086 感謝

+1

嘗試實施[xorshift](https://en.wikipedia.org/wiki/Xorshift)隨機數發生器。這應該是很容易和有用的。 – fuz

回答

3

一個簡單的僞隨機數發生器用25173乘以當前數量的方式,然後增加13849到它。該值現在成爲新的隨機數。
如果你像系統一樣從系統定時器開始(這被稱爲播種的隨機數發生器),這個系列的數字對於簡單的任務將是足夠隨機的!

MOV  AH, 00h ; interrupt to get system timer in CX:DX 
INT  1AH 
mov  [PRN], dx 
call CalcNew ; -> AX is a random number 
xor  dx, dx 
mov  cx, 10  
div  cx  ; here dx contains the remainder - from 0 to 9 
add  dl, '0' ; to ascii from '0' to '9' 
mov  ah, 02h ; call interrupt to display a value in DL 
int  21h  
call CalcNew ; -> AX is another random number 
... 
ret 

; ---------------- 
; inputs: none (modifies PRN seed variable) 
; clobbers: DX. returns: AX = next random number 
CalcNew: 
    mov  ax, 25173   ; LCG Multiplier 
    mul  word ptr [PRN]  ; DX:AX = LCG multiplier * seed 
    add  ax, 13849   ; Add LCG increment value 
    ; Modulo 65536, AX = (multiplier*seed+increment) mod 65536 
    mov  [PRN], ax   ; Update seed = return value 
    ret 

這實現了a Linear Congruential Generator (LCG) with a power-of-2 modulus%65536是免費發生的,因爲產品+增量的低16位在AX中,高位不是。

+0

謝謝!我研究了這個話題,並創建了一個線性同餘發生器。 –

+0

@MichaelPetch:是的,在這一點上,「DX」已經死了。我們只需要一個16x16 => 16位乘法。 DX中沒有額外的熵,因爲給定'AX'可以唯一確定'DX'中的值。即向後查找給出這個「AX」的16位'PRN'種子,並且您還可以計算'DX'。所以在'DX:AX'中將其稱爲32位返回值是沒有意義的。 –

+1

@PeterCordes當晚上晚些時候,我還沒有喝咖啡,我正忙着看A&E展示星球大戰,我不應該看代碼。無視我以前的評論。 (現在刪除)。 –