Когда я выполняю процедуру генератора случайных чисел, которая была предоставлена нам в 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. Это вся документация, которую я могу найти для этой функции, так что это все, что я считаю, что есть об этом.
Нет такой инструкции, как «div eax, ebx». Каков реальный код? –
Это был код, который дал мне дизассемблер. Я этого не писал. – Tracey
Как закодирована инструкция? Каковы байты, которые его составляют (они были бы на адресах 004019CF и 004019D0)? –