2012-06-09 2 views
-1

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

Я предлагаю вам попробовать решить эту проблему на языке высокого уровня первой (например, C), а затем перевести на ассемблер. –

+5

Попробуйте создать случайное число от 0 до 60, а затем вычесть 27 из него. –

ответ

1

Идея заключается в том, чтобы использовать 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 
-1

Вы можете использовать следующий код:

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 

see more

+0

Нет комментариев, чтобы объяснить, что он делает, и ненужные медленные инструкции, такие как 'pushad' /' popad' и 'loop'. Это просто делает то же самое 50 раз из-за pushad/popad. Кроме того, выполнение заканчивается в конце 'main' в' BetterRandomRange' до окончательного возврата. –

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