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

📄 idigit.s

📁 Arithmetic for integers of almost unlimited size for C and C++. Developed and copyrighted by Ra
💻 S
字号:
	.verstamp	2 40	.extern	_bufendtab 0	.extern	_iob 1600	.extern	_sproced 0	.extern	_us_rsthread_stdio 4	.text		.align	2	.file	2 "idigit.c"	.globl	DigitAdd	.loc	2 13 #  13	{	a += carry;	.ent	DigitAdd 2DigitAdd:	.option	O1	.frame	$sp, 0, $31	.loc	2 13	addu	$5, $5, $7	.loc	2 14 #  14		carry = (a < carry);	sltu	$7, $5, $7	.loc	2 15 #  15		a += b;	addu	$5, $5, $6	.loc	2 16 #  16		carry += (a < b);	sltu	$14, $5, $6	addu	$7, $7, $14	.loc	2 17 #  17		*sum = a;	sw	$5, 0($4)	.loc	2 18 #  18		return carry;	move	$2, $7	.livereg	0x2000FF0E,0x00000FFF	j	$31	.end	DigitAdd	.text		.align	2	.file	2 "idigit.c"	.globl	DigitSub	.loc	2 29 #  29	{       DigitType tmp;	.ent	DigitSub 2DigitSub:	.option	O1	subu	$sp, 8	.frame	$sp, 8, $31	.loc	2 30 #  30	        tmp = a-carry;	subu	$14, $5, $7	sw	$14, 4($sp)	.loc	2 31 #  31		carry = (tmp > a);	lw	$15, 4($sp)	sgtu	$7, $15, $5	.loc	2 32 #  32		a = tmp - b;	subu	$5, $15, $6	.loc	2 33 #  33		carry += (a > tmp);	sgtu	$24, $5, $15	addu	$7, $7, $24	.loc	2 34 #  34	        *diff = a;	sw	$5, 0($4)	.loc	2 35 #  35		return carry;	move	$2, $7	.livereg	0x2000FF0E,0x00000FFF	addu	$sp, 8	j	$31	.end	DigitSub	.text		.align	2	.file	2 "idigit.c"	.globl	DigitMult	.loc	2 45 #  45	{	DigitType	al, ah, bl, bh, low1, low2, tmp1, tmp2, tmp3;	.ent	DigitMult 2DigitMult:	.option	O1	subu	$sp, 40	.frame	$sp, 40, $31	.loc	2 47 #  46	 #  47		ah = a>>DDH;	al = (a<<DDH) >> DDH;	srl	$14, $5, 16	sw	$14, 32($sp)	sll	$15, $5, 16	srl	$24, $15, 16	sw	$24, 36($sp)	.loc	2 48 #  48		bh = b>>DDH;	bl = (b<<DDH) >> DDH;	srl	$25, $6, 16	sw	$25, 24($sp)	sll	$8, $6, 16	srl	$9, $8, 16	sw	$9, 28($sp)	.loc	2 50 #  49	 #  50		tmp1 = bl * al;	mul	$10, $9, $24	sw	$10, 12($sp)	.loc	2 51 #  51		low2 = carry + tmp1;	addu	$11, $7, $10	sw	$11, 16($sp)	.loc	2 52 #  52		carry = (low2 < carry);	lw	$12, 16($sp)	sltu	$7, $12, $7	.loc	2 54 #  53	 #  54		tmp2 = bl * ah;	lw	$13, 32($sp)	mul	$14, $9, $13	sw	$14, 8($sp)	.loc	2 55 #  55		low1 = low2 + (tmp2 << DDH);	sll	$15, $14, 16	addu	$25, $12, $15	sw	$25, 20($sp)	.loc	2 56 #  56		carry += (low1 < low2) + (tmp2 >> DDH);	sltu	$8, $25, $12	srl	$10, $14, 16	addu	$11, $8, $10	addu	$7, $7, $11	.loc	2 58 #  57	 #  58		tmp3 = bh * al;	lw	$9, 24($sp)	mul	$13, $9, $24	sw	$13, 4($sp)	.loc	2 59 #  59		low2 = low1 + (tmp3 << DDH);	sll	$15, $13, 16	addu	$12, $25, $15	sw	$12, 16($sp)	.loc	2 60 #  60		carry += (low2 < low1) + (tmp3 >> DDH);	lw	$14, 20($sp)	sltu	$8, $12, $14	srl	$10, $13, 16	addu	$11, $8, $10	addu	$7, $7, $11	.loc	2 62 #  61	 #  62		*prod = low2;	sw	$12, 0($4)	.loc	2 63 #  63		carry += bh * ah;	lw	$9, 24($sp)	lw	$24, 32($sp)	mul	$25, $9, $24	addu	$7, $7, $25	.loc	2 64 #  64		return carry;	move	$2, $7	.livereg	0x2000FF0E,0x00000FFF	addu	$sp, 40	j	$31	.end	DigitMult	.text		.align	2	.file	2 "idigit.c"	.globl	DigitDiv	.loc	2 79 #  79	{       register DigitType qd = 0, carry;	.ent	DigitDiv 2DigitDiv:	.option	O1	subu	$sp, 16	.frame	$sp, 16, $31	.loc	2 79	move	$8, $0	.loc	2 81 #  80		register int i; #  81		for (i=0; i<BitsPerDigit; i++) {	move	$10, $0	bgeu	$10, 32, $35$32:	.loc	2 82 #  82			carry=h>>BPDM1;	srl	$9, $5, 31	.loc	2 83 #  83			h = (h<<1) | (l>>BPDM1);	sll	$14, $5, 1	srl	$15, $6, 31	or	$5, $14, $15	.loc	2 84 #  84			l = l<<1;	sll	$6, $6, 1	.loc	2 85 #  85			qd<<=1;	sll	$8, $8, 1	.loc	2 86 #  86			if (carry || h>=d) {	bne	$9, $0, $33	bltu	$5, $7, $34$33:	.loc	2 87 #  87				qd+=1;	addu	$8, $8, 1	.loc	2 88 #  88				h-=d;	subu	$5, $5, $7	.loc	2 89 #  89		}	}$34:	.loc	2 89	.loc	2 89	addu	$10, $10, 1	bltu	$10, 32, $32$35:	.loc	2 90 #  90		*quot = qd;	sw	$8, 0($4)	.loc	2 91 #  91		return h;	move	$2, $5	.livereg	0x2000FF0E,0x00000FFF	addu	$sp, 16	j	$31	.end	DigitDiv

⌨️ 快捷键说明

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