Code:
.file "parit-15.c"
.arch atmega8
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
.global __do_copy_data
.global __do_clear_bss
; GNU C version 3.4.5 (avr)
.section .init3,"ax",@progbits
.global __init_seed
.type __init_seed, @function
__init_seed:
/* prologue: frame size=0 */
/* prologue: naked */
/* prologue end (size=0) */
ldi r18,lo8(0) ; s,
ldi r19,hi8(0) ; s,
ldi r30,lo8(1120) ; p,
ldi r31,hi8(1120) ; p,
.L7:
ldi r24,hi8(__noinit_start+2) ; ,
cpi r30,lo8(__noinit_start+2) ; p,
cpc r31,r24 ; p,
brlo .L6 ; ,
ld r25,-Z ; tmp43,
ld r24,-Z ; tmp43,
eor r18,r24 ; s, tmp43
eor r19,r25 ; s, tmp43
rjmp .L7 ;
.L6:
sts (seed)+1,r19 ; seed, s
sts seed,r18 ; seed, s
/* epilogue: frame size=0 */
/* epilogue: naked */
/* epilogue end (size=0) */
/* function __init_seed size 17 (17) */
.size __init_seed, .-__init_seed
.text
.global prandom
.type prandom, @function
prandom:
/* prologue: frame size=0 */
/* prologue end (size=0) */
lds r18,seed ; a, seed
lds r19,(seed)+1 ; a, seed
ldi r20,lo8(8704) ; b,
ldi r21,hi8(8704) ; b,
ldi r24,lo8(0) ; c,
ldi r25,hi8(0) ; c,
ldi r22,lo8(-7899) ; tmp49,
ldi r23,hi8(-7899) ; tmp49,
.L13:
sbrs r20,0 ; b,
rjmp .L11 ;
eor r24,r18 ; c, a
eor r25,r19 ; c, a
.L11:
lsl r18 ; a
rol r19 ; a
sbrs r19,7 ; a
rjmp .L12 ;
eor r18,r22 ; a, tmp49
eor r19,r23 ; a, tmp49
.L12:
lsr r21 ; b
ror r20 ; b
cp r20,__zero_reg__ ; b
cpc r21,__zero_reg__ ; b
brne .L13 ; ,
sts (seed)+1,r25 ; seed, c
sts seed,r24 ; seed, c
/* epilogue: frame size=0 */
ret
/* epilogue end (size=1) */
/* function prandom size 30 (29) */
.size prandom, .-prandom
.lcomm seed,2
/* File "parit-15.c": code 47 = 0x002f ( 46), prologues 0, epilogues 1 */
Die Periode der Zahlen liegt bei 2^15-1 = 32767. Für gleiche seed wird auch die gleiche Folge erzeugt. Ein Zufallswert ist nur abhängig von der Anfangs-seed und der Anzahl der prandom-Aufrufe.
Lesezeichen