使用Raspberry Pi

时间:2016-05-10 23:05:35

标签: assembly random arm raspberry-pi

我目前正在处理一个装配项目,我必须生成一个随机数。到目前为止,我已经成功编写了一些应该可行的代码,但我认为这样做并不是因为它不会打印随机数。我的代码是这样的:

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

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

1 个答案:

答案 0 :(得分: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读取一个字节并将其打印到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 "%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上测试