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

📄 dc2.s

📁 UNIX v6源代码 这几乎是最经典的unix版本 unix操作系统设计和莱昂氏unix源代码分析都是用的该版
💻 S
字号:
///	routine to add the two centennial numbers/	pointed to by r2 and r3./	a pointer to the result is returned in r1/	r2 and r3 are preserved//	mov	ptr1,r2/	mov	ptr2,r3/	jsr	pc,add3/	mov	r1,.../add3:	mov	r0,-(sp)	mov	r4,-(sp)	mov	r5,-(sp)	mov	r3,-(sp)	mov	r2,-(sp)//	allocate a new string whose length is/	the max of the two addends./	mov	w(r2),r0	sub	a(r2),r0	mov	w(r3),r4	sub	a(r3),r4	cmp	r0,r4	bgt	1f	mov	r4,r01:	mov	r0,r4	jsr	pc,allocate	mov	r1,-(sp)//	get everything ready/	mov	2(sp),r1	jsr	pc,rewind	mov	4(sp),r1	jsr	pc,rewind	clr	carry//	now add them/2:	dec	r4	blt	3f	mov	2(sp),r1	/r2	jsr	pc,getchar	mov	r0,r5	mov	4(sp),r1	/r3	jsr	pc,getchar	add	r5,r0	add	carry,r0	clr	carry	cmp	r0,$100.	blt	1f	sub	$100.,r0	mov	$1,carry1:	tstb	r0	bpl	1f	add	$100.,r0	mov	$-1,carry1:	mov	(sp),r1		/r1	jsr	pc,putchar	br	2b//	perhaps there is an extra digit/3:	mov	carry,r0	beq	2f	mov	(sp),r1		/r1	jsr	pc,putchar//	strip leading zeros/2:	jsr	pc,fsfile2:	jsr	pc,backspace	bes	2f	beq	2b	inc	r(r1)2:	mov	r(r1),w(r1)//	strip leading 99's/	jsr	pc,fsfile	jsr	pc,backspace	cmpb	r0,$-1	bne	1f2:	jsr	pc,backspace	bes	2f	cmpb	r0,$99.	beq	2b	jsr	pc,getchar2:	mov	$-1,r0	jsr	pc,alterchar	mov	r(r1),w(r1)//	restore and return/1:	mov	(sp)+,r1	mov	(sp)+,r2	mov	(sp)+,r3	mov	(sp)+,r5	mov	(sp)+,r4	mov	(sp)+,r0	rts	pc/.bsscarry:	.=.+2.text///	routine to change the sign of the centennial number/	pointed to by r1./	negative numbers are stored in 100's complement form with/	-1 as the high order digit; the second digit is not 99.//	mov	...,r1/	jsr	pc,chsign/chsign:	mov	r1,-(sp)	mov	r0,-(sp)	jsr	pc,rewind	clr	chcarry/1:	jsr	pc,lookchar	bes	1f	negb	r0	sub	chcarry,r0	mov	$1,chcarry	add	$100.,r0	cmpb	$100.,r0	bgt	2f	sub	$100.,r0	clr	chcarry2:	jsr	pc,alterchar	br	1b/1:	clr	r0	sub	chcarry,r0	beq	2f	jsr	pc,putchar	jsr	pc,fsfile	jsr	pc,backspace	jsr	pc,backspace	cmp	r0,$99.	bne	1f	mov	r(r1),w(r1)	mov	$-1,r0	jsr	pc,putchar	br	1f/2:	jsr	pc,fsfile	jsr	pc,backspace	bne	1f	mov	r(r1),w(r1)/1:	mov	(sp)+,r0	mov	(sp)+,r1	rts	pc/.bsschcarry: .=.+2.text/////	routine to multiply the two centennial numbers/	pointed to by r2 and r3./	a pointer to the result is returned in r1/	r2 and r3 are preserved//	mov	ptr1,r2/	mov	ptr2,r3/	jsr	pc,mul3/	mov	r1,...//	save registers and make space for temps/mul3:	mov	r5,-(sp)	mov	r3,-(sp)	/arg2	mov	r2,-(sp)	/arg1	mov	r0,-(sp)	tst	-(sp)		/result	tst	-(sp)		/arg1	tst	-(sp)		/arg2	tst	-(sp)		/carry//	compute sign of result and make args positive/	clr	outsign	mov	r2,r1	jsr	pc,fsfile	jsr	pc,backspace	bmi	2f	mov	r2,4(sp)	/arg1	br	1f2:	jsr	pc,length	jsr	pc,allocate	mov	r1,4(sp)	mov r2,r0	jsr	pc,move	jsr	pc,chsign	com	outsign1:	mov	r3,r1	jsr	pc,fsfile	jsr	pc,backspace	bmi	2f	mov	r3,2(sp)	/arg2	br	1f2:	mov	r3,r1	jsr	pc,length	jsr	pc,allocate	mov	r1,2(sp)	mov	r3,r0	jsr	pc,move	jsr	pc,chsign	com	outsign1://	compute the length of the result and/	allocate space for it/	mov	w(r2),r0	sub	a(r2),r0	add	w(r3),r0	sub	a(r3),r0	jsr	pc,allocate	jsr	pc,zero	mov	r1,6(sp)	/result	clr	offset	mov	2(sp),r1	/arg2	jsr	pc,rewind//	work on next digit of arg2, starting over on arg1/1:	mov	4(sp),r1	/arg1	jsr	pc,rewind	mov	2(sp),r1	/arg2	jsr	pc,getchar	bes	3f	mov	r0,r2	mov	6(sp),r1	/result	jsr	pc,rewind	add	offset,r(r1)	clr	0(sp)		/carry//	work on next digit of arg3/	form the product of the two digits,/	add to what is already there and add in old carry/	to generate new dit and new carry./2:	mov	4(sp),r1	/arg1	jsr	pc,getchar	bes	2f	mov	r0,r3	mpy	r2,r3	add	(sp),r3		/carry	mov	6(sp),r1	/result	jsr	pc,lookchar	add	r0,r3	mov	r3,r1	clr	r0	dvd	$100.,r0	mov	r0,(sp)		/carry	mov	r1,r0	mov	6(sp),r1	/result	jsr	pc,alterchar	br	2b/2:	inc	offset	tst	(sp)		/carry	beq	1b	mov	6(sp),r1	/result	jsr	pc,lookchar	add	(sp),r0		/carry	jsr	pc,alterchar	br	1b/3://	change sign of result if necessary/	tst	outsign	bpl	1f	mov	6(sp),r1	/result	jsr	pc,chsign//	release dregs if necessary/1:	cmp	2(sp),14(sp)	beq	1f	mov	2(sp),r1	jsr	pc,release1:	cmp	4(sp),12(sp)	beq	1f	mov	4(sp),r1	jsr	pc,release1://	restore registers and return/	tst	(sp)+	tst	(sp)+	tst	(sp)+	mov	(sp)+,r1	mov	(sp)+,r0	mov	(sp)+,r2	mov	(sp)+,r3	mov	(sp)+,r5	rts	pc/.bssoutsign: .=.+2offset:	.=.+2k:	.=.+2kptr:	.=.+2.text/sqrt:	mov	r4,-(sp)	mov	r3,-(sp)	mov	r2,-(sp)	mov	r0,-(sp)//	check for zero or negative/	mov	w(r1),r2	sub	a(r1),r2//	look at the top one or two digits/	mov	r1,r3	jsr	pc,fsfile	jsr	pc,backspace	mov	r0,r4	bit	$1,r2	bne	2f	mov	r4,r1	mul	$100.,r1	mov	r1,r4	mov	r3,r1	jsr	pc,backspace	add	r0,r42://	allocate space for result/	inc	r2	asr	r2	mov	r2,r0	jsr	pc,allocate	jsr	pc,zero	mov	r2,r0	jsr	pc,seekchar	mov	r1,r2//	get high order digit of arg and square root it/	mov	$1,r02:	sub	r0,r4	blt	2f	add	$2,r0	br	2b2:	inc	r0	asr	r0	mov	r0,r4	mov	r2,r1	jsr	pc,fsfile	jsr	pc,backspace	cmp	r4,$100.	blt	1f	sub	$100.,r4	mov	r4,r0	jsr	pc,alterchar	mov	$1,r0	jsr	pc,putchar	br	2f1:	mov	r4,r0	jsr	pc,alterchar2:	mov	r1,-(sp)	mov	r3,-(sp)//	get successive approx. from Newton/1:	mov	(sp),r3		/arg	mov	2(sp),r2	/approx	jsr	pc,div3	mov	r1,r3	jsr	pc,add3	mov	r1,-(sp)	mov	r3,r1	jsr	pc,release	mov	r4,r1	jsr	pc,release	mov	(sp)+,r1	mov	sqtemp,r2	mov	r1,r3	jsr	pc,div3	mov	r1,-(sp)	mov	r3,r1	jsr	pc,release	mov	r4,r1	jsr	pc,release	mov	(sp)+,r3	mov	2(sp),r1	jsr	pc,length	jsr	pc,allocate	mov	2(sp),r0	jsr	pc,move	jsr	pc,chsign	mov	r1,r2	jsr	pc,add3	jsr	pc,fsfile	jsr	pc,backspace	jsr	pc,release	mov	r2,r1	jsr	pc,release	tst	r0	bpl	2f//	loop if new < old	mov	2(sp),r1	jsr	pc,release	mov	r3,2(sp)	br	1b/2:	mov	r3,r1	jsr	pc,release	mov	(sp)+,r1	jsr	pc,release	mov	(sp)+,r1	mov	(sp)+,r0	mov	(sp)+,r2	mov	(sp)+,r3	mov	(sp)+,r4	rts	pc

⌨️ 快捷键说明

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