📄 idigit.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 + -