如何使用1--4范围内的汇编代码生成随机数?
答案 0 :(得分:3)
1 +(rand()%4),一般来说(其中rand()是一个不错的随机整数生成器)。
call [_rand]
mod eax, 4 ; or 'and eax, 3' - same thing
inc eax
关于如何实现rand(),你可以去说Mersenne Twister,但这很复杂。
答案 1 :(得分:1)
您可以拥有自己的准随机数生成器。 如果你可以访问RTC(实时时钟计数器)或CPU时间戳,那么你可以比较简单。
很简单的例子:
Int LastIteration;
Int IterationCounter;
...
++IterationCounter;
LastIteration = CpuTimeStamp + IterationCounter;
RndNum = LastIteration & 3 + 1;
如果你每秒不需要很多生成的数字,这个准rnd生成器是不可预测的。
答案 2 :(得分:1)
这是一种简单的技术,可以获得一些“随机”数字(虽然它不是随机的),如果API没有提供一个
您可以将它用于所有语言(只要您可以访问时间)。
对于68K的高级随机数生成器,您可以看到this link。
答案 3 :(得分:0)
不知道你试图在哪个系统上执行此操作,所以这是一个通用答案,应该适用,无论哪个:
query the system time, using whatever syscall / library call / api you have available
and out the top bits, leaving only the lowest 2
tadaa。 randum数字。
如果你想让它们更随机使用,也许可以这样做:
query the system time
and out the top bits leaving only the lowest 4 store in "register1"
Loop:
do something unimportant
do something else unimportant
etc.
count down register1
jump to EndLoop if register1==0
jump Loop
EndLoop:
query the system time
and out the top bits, leaving just the lower two
干杯!
/ B2S
编辑:对不起,已经离开了互联网的假期。 (是的,这些地方依然存在真的令人惊讶)我对EyeBot和68k asm都不是特别熟悉。所以我不知道要在时钟或时间读取的系统调用(要么会这样做)。所以看一下,剩下的代码应该是
//Assuming you have called the syscall to get the system time/clock, and stored it in D0
AND #%01111, D0
loop:
// It really doesn't matter,
// What Instructions you put here,
// just put 4 or 5 instructions that don't
// mess with D0, eg. AND, MOVE, ADD, AND, OR
SUB #1, D0
TST D0 // TST instruction is probably not needed
BEQ EndLoop
JMP loop
EndLoop:
// Get the system time/clock again (Next instruction assumes clock is in D0)
AND #%011, D0
D0现在应该包含您的随机数