我目前正在处理一个装配项目,我必须生成一个随机数。到目前为止,我已经成功编写了一些应该可行的代码,但我认为这样做并不是因为它不会打印随机数。我的代码是这样的:
/*--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 :(得分: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上测试