0

当我实现在 Assembly 中为我们提供的随机数生成程序时,一半时间它给了我除以零误差,另一半时间它完美地工作。我相信我正确地实现了代码,但会告诉你我是如何编写代码的。

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 Studios 提供给我的 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

是发送给 RandomRange 函数的mov eax,10参数,它会RandomRange(10);在 C 中。请注意,因为 RandomRange 在 eax 中返回其结果,所以您需要在每次调用之前进行设置。

于 2014-03-16T21:48:36.273 回答
0
Random32  PROC
;
; Generates an unsigned pseudo-random 32-bit integer
;   in the range 0 - FFFFFFFFh.

Random32 可以返回 0,这可能就是当你除以 0 时它会轰炸你的原因 :-)

Irvine 源可用,只需修改 RandomRange 以在从 Random32 返回时处理 0

于 2012-05-07T01:30:56.647 回答
0

尔湾图书馆的帮助文件

Irvine32 源文件

于 2012-05-07T02:11:23.990 回答