0

アセンブリで提供された乱数生成手順を実装すると、半分の時間でゼロ除算エラーが発生し、残りの半分で完全に機能します。コードを適切に実装していると思いますが、どのように記述したかを説明します。

randomCompNum PROC
    call Randomize               ;Sets seed
    mov  eax,10                  ;Keeps the range 0 - 9

    call RandomRange
    mov  compNum1,eax            ;First random number

L1: call RandomRange
    .IF eax == compNum1          ;Checks if the second number is the same as the first
        jmp L1                   ;If it is, repeat call
    .ENDIF
     mov compNum2,eax            ;Second random number

L2: call RandomRange
    .IF eax == compNum1          ;Checks if the third number is the same as the first
        jmp L2                   ;If it is, repeat
    .ELSEIF eax == compNum1      ;Checks if the third number is the same as the second
        jmp L2                   ;If it is, repeat
    .ENDIF
    mov compNum3,eax             ;Third random number stored

    ret

randomCompNum ENDP

これは、Visual Studio から提供された RandomRange の逆アセンブリです。

_RandomRange@0:
004019C1  push         ebx  
004019C2  push         edx  
004019C3  mov          ebx,eax  
004019C5  call         _Random32@0 (4019A6h)  ;<---- This function doesn't touch ebx
004019CA  mov          edx,0  
004019CF  div          eax,ebx     ;<---- That's where the error occurs
004019D1  mov          eax,edx  
004019D3  pop          edx  
004019D4  pop          ebx  
004019D5  ret

このエラーの原因を知っていますか?

独自の乱数ジェネレーターを作成したくなります。

RandomRange メソッドの背景:簡単です。Randomize でシードを設定し、10 を eax に移動すると、RandomRange が 0 から 9 の間で維持されます。これが、その関数について見つけたすべてのドキュメントです。

4

3 に答える 3

1

これは古い質問だと思いますが、私の友人がちょうどそれを参照しました。

あなたmov eax, 10は に属しているcall RandomRangeため、コードのサンプルは次のようになります。

randomCompNum PROC
    call Randomize               ;Sets seed

    mov  eax,10                  ;Keeps the range 0 - 9
    call RandomRange
    mov  compNum1,eax            ;First random number

L1: mov  eax,10                  ;Keeps the range 0 - 9
    call RandomRange
    .IF eax == compNum1          ;Checks if the second number is the same as the first
        jmp L1                   ;If it is, repeat call
    .ENDIF
     mov compNum2,eax            ;Second random number

L2: mov  eax,10                  ;Keeps the range 0 - 9
    call RandomRange
    .IF eax == compNum1          ;Checks if the third number is the same as the first
        jmp L2                   ;If it is, repeat
    .ELSEIF eax == compNum1      ;Checks if the third number is the same as the second
        jmp L2                   ;If it is, repeat
    .ENDIF
    mov compNum3,eax             ;Third random number stored

    ret
randomCompNum ENDP

これmov eax,10は RandomRange 関数に送信されるパラメーターでありRandomRange(10);、C で記述されます。RandomRange はその結果を eax で返すため、各呼び出しの前に設定する必要があることに注意してください。

于 2014-03-16T21:48:36.273 に答える
0

Irvine Library のヘルプ ファイル

Irvine32 ソース ファイル

于 2012-05-07T02:11:23.990 に答える
0
Random32  PROC
;
; Generates an unsigned pseudo-random 32-bit integer
;   in the range 0 - FFFFFFFFh.

Random32 は 0 を返すことができるため、0 で除算すると爆撃される可能性があります :-)

Irvine ソースが利用可能です。Random32 から返されたときに 0 を処理するように RandomRange を変更するだけです。

于 2012-05-07T01:30:56.647 に答える