【问题标题】:Generating a random number in ARM assembly with Raspberry Pi使用 Raspberry Pi 在 ARM 程序集中生成随机数
【发布时间】: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


【解决方案1】:

如果您想尝试更多选项,这里有一些通知可以让您的程序打印出来。

/*--random01.s*/
.data

.balign 4
mensaje1: .asciz "Random \n"

@ ---- Added ----
.balign 4
format: .asciz "%d \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

@ ---- Added ----
    mov r1, r0              @ num goes to r1
    ldr r0, addr_of_format  @ format to r0
@ ---------------

@   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
@ ---- Added ----
addr_of_format: .word format
@ ---------------
.global printf

这是一个从 /dev/urandom 读取一个字节并将其打印到标准输出的程序。该数字是 0 到 255(这些数字之一或它们之间)。一些参考是http://cseweb.ucsd.edu/~swanson/papers/Oakland2013EarlyEntropy.pdf。大部分没看懂。

@----------------------------------

.data

@ See /usr/include/arm-linux-gnueabihf/asm/unistd.h
@ See /usr/include/arm-linux-gnueabihf/bits/fcntl-linux.h

    .equ create,     8
         .equ Mode, 0644       @ -rw-r--r--
    .equ open,       5
         .equ Rd,   00
         .equ Wr,   01
         .equ RdWr, 02
         .equ Apnd, 02000
    .equ read,       3
    .equ write,      4
    .equ close,      6
    .equ sync,       36
    .equ exit,       1
    .equ sfile,      187

@----------------------------------

.balign 4
dir_file:
    .asciz "/dev/urandom"

.balign 4
Open:
    .word dir_file, RdWr | Apnd, open

.balign 4
Buf:
    .word 0 

.balign 4
Read:
    .word Buf, 1, read

.balign 4
format:
    .asciz "%3d\n"

@----------------------------------

.text

.global main, printf

main:

     push   {r4, r5, r7, lr}     @ folowing AAPCS

     ldr    r3, =Open            @ load address
     ldm    r3, {r0, r1, r7}     @ load registers
     svc    #0                   @ OS opens file
     mov    r4, r0               @ save fd in r4

     ldr    r3, =Read            @ load address
     ldm    r3, {r1, r2, r7}     @ load registers
     svc    #0                   @ OS reads file

     mov    r0, r4               @ move fd in r0
     mov    r7, #close           @ num for close
     svc    #0                   @ OS closes file

     ldr    r0, =format          @ adress of format
     ldr    r1, =Buf             @ addr of byte red
     ldr    r1, [r1]             @ load byte
     bl     printf               @ C() print byte
     mov    r0, #0               @ 0 = success

exit:

     pop    {r4, r5, r7, lr}     @ folowing AAPCS
     bx     lr                   @ Exit if use gcc as linker

注意: 至于汇编,gcc链接,在RPi3上测试

【讨论】:

  • 您也可以使用 GCC 一次性组装和链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多