Генерировать случайное число в диапазоне в сборке

Я пытаюсь создать случайное число между -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

узнать больше

Другие вопросы по тегам