2016-11-19 5 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()機能または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にあり、上位ビットがAXでないため、フリーで行われます。

+0

ありがとう!トピックを研究し、線形合同ジェネレータを作成しました。 –

+0

@MichaelPetch:はい、その時点で「DX」は死んでいます。 16×16 => 16ビットの乗算だけが必要です。 DXには余分なエントロピーはありません。与えられた 'AX'は' DX'の値を一意に決めることができるからです。すなわち、この「AX」を与える16ビットの 'PRN'シードを見つけるために後方に作業し、' DX'を計算することもできます。したがって、 'DX:AX'では32ビットの戻り値と呼ぶのは意味がありません。 –

+1

@PeterCordes夕方になってコーヒーを飲みませんでしたが、スターウォーズを見せているA&Eを見て忙しくて、コードを見てはいけません。私の以前のコメントは無視してください。 (今削除されました)。 –