⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rand.s

📁 操作系统SunOS 4.1.3版本的源码
💻 S
字号:
#define LOCORE#include <machine/asm_linkage.h>! Copyright (c) 1986 by Sun Microsystems, Inc.!! long rand(),srand()! Fast integer random number generators, to replace UNIX's rand()! Code by K.C. Ng, Nov 3, 1986!! rand() is based on the additive number generator described in Knuth's ! The art of computing  Vol II (second edition) section 3.2.2. It returns a ! positive random integer. ! srand() uses ax+c mod 2**32 to generate seeds for rand(). Here ! a=8*(10**8-29)+5, c=10**9-63.!	.seg	"data"	.asciz	"@(#)rand.S 1.1 92/07/30 Copyr 1986 Sun Micro"	.seg	"text"#if 0	ENTRY(rand)	set	base-4,%o5	! o5 = address of base Y[0]	ld	[%o5-4],%o1	! o1 = j	ld	[%o5],%o2	! o2 = k	add	%o5,%o1,%o3	! o3 = address of Y[j]	add	%o5,%o2,%o4	! o4 = address of Y[k]	ld	[%o3],%o0	! o0 = Y[j]	ld	[%o4],%o3	! o3 = Y[k]	add	%o0,%o3,%o0	! o0 = Y[j]+Y[k]	st	%o0,[%o4]	! replace Y[k] by Y[j]+Y[k]	subcc	%o1,4,%o1	bnz	1f	nop	or	%g0,220,%o11:	st	%o1,[%o5-4]	! j <- j-1 mod 56	subcc	%o2,4,%o2	bnz	1f	sethi	%hi(0x80000000),%o1	or	%g0,220,%o21:	st	%o2,[%o5]	! k <- k-1 mod 56	retl	andn	%o0,%o1,%o0	! make it positive		.seg	"data"	.align	4j:	.word	96	! jk:	.word	220	! kbase:	.word 0x8ca0df45, 0x37334f23, 0x4a5901d2, 0xaeede075, 0xd84bd3cf	.word 0xa1ce3350, 0x35074a8f, 0xfd4e6da0, 0xe2c22e6f, 0x045de97e	.word 0x0e6d45b9, 0x201624a2, 0x01e10dca, 0x2810aef2, 0xea0be721	.word 0x3a3781e4, 0xa3602009, 0xd2ffcf69, 0xff7102e9, 0x36fab972	.word 0x5c3650ff, 0x8cd44c9c, 0x25a4a676, 0xbd6385ce, 0xcd55c306	.word 0xec8a31f5, 0xa87b24ce, 0x1e025786, 0x53d713c9, 0xb29d308f	.word 0x0dc6cf3f, 0xf11139c9, 0x3afb3780, 0x0ed6b24c, 0xef04c8fe	.word 0xab53d825, 0x3ca69893, 0x35460fb1, 0x058ead73, 0x0b567c59	.word 0xfdddca3f, 0x6317e77d, 0xaa5febe5, 0x655f73e2, 0xd42455bb	.word 0xe845a8bb, 0x351e4a67, 0xa36a9dfb, 0x3e0ac91d, 0xbaa0de01	.word 0xec60dc66, 0xdb29309e, 0xcfa52971, 0x1f3eddaf, 0xe14aae61	.seg	"text"	ENTRY(srand)	save	%sp,-SA(MINFRAME),%sp	! Stack Align #MINFRAME	set	a,%l0			! l0 = address of a	set	base,%l2		! l2 = address of base in _rand	set	zbase,%l4		! l4 = address of zbase	ld	[%l0+4],%l1		! l1 = c	ld	[%l0],%l0		! l0 = a	or	%g0,96,%l3		! l3 = 4*24	st	%l3,[%l2-8]		! store 4*24 in j	or	%g0,220,%l3		! l3 = 4*55	st	%l3,[%l2-4]		! store 4*55 in k	or	%g0,55,%l3		! set l3 = 55	mov	%i0,%o01:	subcc	%l3,1,%l3		! counter	bge	2f	tst	%o0	ret	restore2:	bne	3f	mov	%l0,%o1	ld	[%l4],%o1	st	%o1,[%l2]	add	%l2,4,%l2	ba	1b	add	%l4,4,%l43:	call	.mul			! a*x	nop	add	%o0,%l1,%o0		! ax+c	srl	%o0,1,%o0		! (ax+c)>>1	st	%o0,[%l2]	ba	1b	add	%l2,4,%l2	.seg	"data"	.align	4a:	.word 0x2faf071d	! a  = 8*(10**8-29)+5c:	.word 0x3b9ac9c1	! c  = 10**9-63		zbase:	.word 0x8ca0df45, 0x37334f23, 0x4a5901d2, 0xaeede075, 0xd84bd3cf	.word 0xa1ce3350, 0x35074a8f, 0xfd4e6da0, 0xe2c22e6f, 0x045de97e	.word 0x0e6d45b9, 0x201624a2, 0x01e10dca, 0x2810aef2, 0xea0be721	.word 0x3a3781e4, 0xa3602009, 0xd2ffcf69, 0xff7102e9, 0x36fab972	.word 0x5c3650ff, 0x8cd44c9c, 0x25a4a676, 0xbd6385ce, 0xcd55c306	.word 0xec8a31f5, 0xa87b24ce, 0x1e025786, 0x53d713c9, 0xb29d308f	.word 0x0dc6cf3f, 0xf11139c9, 0x3afb3780, 0x0ed6b24c, 0xef04c8fe	.word 0xab53d825, 0x3ca69893, 0x35460fb1, 0x058ead73, 0x0b567c59	.word 0xfdddca3f, 0x6317e77d, 0xaa5febe5, 0x655f73e2, 0xd42455bb	.word 0xe845a8bb, 0x351e4a67, 0xa36a9dfb, 0x3e0ac91d, 0xbaa0de01	.word 0xec60dc66, 0xdb29309e, 0xcfa52971, 0x1f3eddaf, 0xe14aae61#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -