Генерировать случайное число в диапазоне в сборке
Я пытаюсь создать случайное число между -27 и +33 в сборке.
Есть процедура, которая называется Randomize
который генерирует случайное число от 0 до n, где n - верхняя граница.
Как сдвинуть нижнюю границу на -27, а не на 0?
Это код:
title test
INCLUDE irvine32.inc
.data
msg byte "Genrating 50 number",0
.code
main PROC
mov edx,offset byte
call WriteString
call crlf
mov ecx,50
L1:
mov eax,+33
call RandomRange
call writeDec
exit
main ENDP
END main
2 ответа
Идея состоит в том, чтобы использовать RandomRange для генерации целых чисел от 0 до (33+27-1), а затем вычесть 27 из сгенерированного числа. Приведенный ниже код должен заполнить массив n случайными целыми числами и отобразить массив. Рандомизированный диапазон составляет [-27,33]
INCLUDE Irvine32.inc
j equ 27
k equ 33
n =10
.data
arrayd sdword n dup(?)
.code
main proc
call randomize ;activate the seed
mov ecx,n
mov esi,0
L1: ;the trick is the 3 instruction lines shown below
mov eax,k+j
call randomrange
sub eax, j
mov arrayd[esi*4],eax
inc esi
loop L1
mov ecx,n
mov esi,0
L2:
mov eax,arrayd[esi*4]
call writeInt
mov al,20h
call writechar
inc esi
loop L2
exit
main endp
end main
Вы можете использовать следующий код:
include Irvine32.inc
.data
.code
main proc
mov ebx, -27
mov eax, 33
mov ecx, 50
L1:
pushad ; save all 32bit registers
call BetterRandomRange
call writeint
call crlf
popad ; restore all 32bit registers
loop L1
main endp
BetterRandomRange proc
neg ebx
add eax, ebx
call randomrange
sub eax, ebx
ret
BetterRandomRange endp
end main