これ以上のオプションを試したい場合は、印刷するためのプログラムへの通知があります。ここで
/*--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
でテストなしこれはひどい乱数ジェネレータです。 R0が始まる値は決して変化しない数値の 'printf'の戻り値です。 TST命令とADC命令は何もしません。 MOVS命令はキャリーフラグにシフトします。これは 'printf'にセットされているので、常に同じになる可能性が高いです。したがって、最初のシードは本質的にprintfの戻り値です。 EOR命令は、不完全なxorshiftの実装のように見えます。それで 'ldr r0、[r0]'を実行すると、 "ランダム"が読み込まれますが、常に同じメモリロケーションになり、おそらくクラッシュします。 –
_「乱数は印刷されません」_ - まあ、なぜでしょうか? Rossが指摘していること以外にも、 'printf'への2度目の呼び出しのためのフォーマット文字列はありません。 – Notlikethat
'/ dev/urandom'を開き、いくつかのバイトを読みます。 –