2012-05-07 1 views
0

Когда я выполняю процедуру генератора случайных чисел, которая была предоставлена ​​нам в Assembly, половина времени дает мне деление на нулевую ошибку, а другая половина времени работает отлично. Я считаю, что я правильно внедряю код, но расскажу вам, как я его написал.Сборка произвольного числа с использованием Irvine

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 

Вот разборки для RandomRange что Визуальный Studios предоставил мне

[email protected]: 
004019C1 push   ebx 
004019C2 push   edx 
004019C3 mov   ebx,eax 
004019C5 call   [email protected] (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. Это вся документация, которую я могу найти для этой функции, так что это все, что я считаю, что есть об этом.

+0

Нет такой инструкции, как «div eax, ebx». Каков реальный код? –

+0

Это был код, который дал мне дизассемблер. Я этого не писал. – Tracey

+0

Как закодирована инструкция? Каковы байты, которые его составляют (они были бы на адресах 004019CF и 004019D0)? –

ответ

0
Random32 PROC 
; 
; Generates an unsigned pseudo-random 32-bit integer 
; in the range 0 - FFFFFFFFh. 

Random32 МОЖЕТ возвращать 0, что, вероятно, почему он бомбит на вас, когда вы делите на 0 :-)

Источник Irvine доступен, просто изменить RandomRange обрабатывать 0, когда вернулся из Random32

+0

Я не совсем уверен, как получить доступ к файлу. Я пробовал отслеживать через включенные файлы в Irvine32.inc, но я не могу найти фактический код для изменения. Должен ли я просто скопировать и вставить разборку и перезаписать ее? – Tracey

+0

Я не думаю, что это действительная рекомендация.RandomRange возвращает значение, меньшее аргумента (см. Файл справки). И оба являются значениями без знака. Итак, если вы передадите 0 в RandomRange, какое неотрицательное целое число меньше 0, если оно вернется? –

1

Я понимаю, что это старый вопрос, но мой друг только refere его.

Ваш 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, было бы в C. Примечание RandomRange(10);, что из-за возвращения RandomRange его результат в eax, вам нужно настроить его перед каждым вызовом.

Смежные вопросы