2016-05-10 23 views
1

現在、現在アセンブリプロジェクトを行っており、乱数を生成する必要があります。これまで私はうまくいくはずのコードを書くことに成功しましたが、乱数を出力しないと思っていません。私のコードは次のとおりです: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 

私の質問は、どのように乱数の生成を達成できますか?私はこれを正しくやっているのですか、私は時計を使って作業しようとしますか?

+0

でテストなしこれはひどい乱数ジェネレータです。 R0が始まる値は決して変化しない数値の 'printf'の戻り値です。 TST命令とADC命令は何もしません。 MOVS命令はキャリーフラグにシフトします。これは 'printf'にセットされているので、常に同じになる可能性が高いです。したがって、最初のシードは本質的にprintfの戻り値です。 EOR命令は、不完全なxorshiftの実装のように見えます。それで 'ldr r0、[r0]'を実行すると、 "ランダム"が読み込まれますが、常に同じメモリロケーションになり、おそらくクラッシュします。 –

+0

_「乱数は印刷されません」_ - まあ、なぜでしょうか? Rossが指摘していること以外にも、 'printf'への2度目の呼び出しのためのフォーマット文字列はありません。 – Notlikethat

+0

'/ dev/urandom'を開き、いくつかのバイトを読みます。 –

答えて

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のから1つのバイトを読み込み、標準出力にそれを印刷したプログラムです。番号は0〜255(その番号の1つまたはその間の1つ)です。参考資料は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

+0

GCCを使って、一度にアセンブルしてリンクすることもできます。 – edmz