【发布时间】:2016-05-10 23:05:35
【问题描述】:
我现在正在做一个组装项目,我必须生成一个随机数。到目前为止,我已经设法编写了一些应该可以工作的代码,但我认为它不起作用,因为它不会打印随机数。我的代码是这样的:
/*--random01.s*/
.data
.balign 4
mensaje1: .asciz "Random \n"
.balign 4
return: .word 0
.text
.global main
main:
ldr r1, addr_of_return
str lr, [r1]
ldr r0, addr_of_msg1
bl printf
tst r1,r1, lsr #1
movs r2,r0, rrx
adc r1,r1, r1
eor r2,r2, r0, lsl #12
eor r0,r2, r2, lsr #20
ldr r0, [r0]
bl printf
ldr lr, addr_of_return
ldr lr, [lr]
bx lr
addr_of_msg1: .word mensaje1
addr_of_return: .word return
.global printf
我的问题是,如何实现随机数的生成?我这样做是对的还是应该尝试使用时钟?
【问题讨论】:
-
不,这是一个糟糕的随机数生成器。 R0 开头的值是
printf的返回值,一个永远不会改变的数字。 TST 和 ADC 指令什么都不做。 MOVS 指令在进位标志中移动,这是printf设置的任何值,因此很可能总是相同的。所以你的初始种子本质上是 printf 的返回值。 EOR 指令看起来像一个不完整的 xorshift 实现。然后您执行ldr r0, [r0]读取“随机”但始终相同的内存位置并且可能崩溃。 -
“它不打印随机数” - 好吧,为什么会这样?除了罗斯指出的所有事情之外,第二次调用
printf没有格式字符串。 -
你应该打开
/dev/urandom并读取一些字节。 -
哦!好的好的谢谢大家(我是新手)。非常感谢您的回答,我将修复错误。
标签: assembly random arm raspberry-pi