使用Raspberry Pi在ARM程序集中生成随机数



我现在正在处理一个组装项目,我必须生成一个随机数。到目前为止,我已经设法编写了一些应该有效的代码,但我认为不起作用,因为它没有打印随机数。我的代码是:

/*--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

我的问题是,如何实现随机数的生成?我这样做对吗?还是应该试着用时钟工作?

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

/*--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读取一个字节并将其打印到stdout的程序。数字是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 "%3dn"
@----------------------------------
.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 上测试

最新更新