📄 runtime.s
字号:
# int *initArray(int size, int init)# {int i;# int *a = (int *)malloc(size*sizeof(int));# for(i=0;i<size;i++) a[i]=init;# return a;# }.textinitArray:sll $a0,$a0,2li $v0,9syscallmove $a2,$v0b Lrunt2Lrunt1:sw $a1,($a2)sub $a0,$a0,4add $a2,$a2,4Lrunt2:bgtz $a0, Lrunt1j $ra# # int *allocRecord(int size)# {int i;# int *p, *a;# p = a = (int *)malloc(size);# for(i=0;i<size;i+=sizeof(int)) *p++ = 0;# return a;# }allocRecord:li $v0,9syscallmove $a2,$v0b Lrunt4Lrunt3:sw $0,($a2)sub $a0,$a0,4add $a2,$a2,4Lrunt4:bgtz $a0, Lrunt3j $ra# struct string {int length; unsigned char chars[1];};# # int stringEqual(struct string *s, struct string *t)# {int i;# if (s==t) return 1;# if (s->length!=t->length) return 0;# for(i=0;i<s->length;i++) if (s->chars[i]!=t->chars[i]) return 0;# return 1;# }stringEqual:beq $a0,$a1,Lrunt10lw $a2,($a0)lw $a3,($a1)addiu $a0,$a0,4addiu $a1,$a1,4beq $a2,$a3,Lrunt11Lrunt13:li $v0,0j $raLrunt12:lbu $t0,($a0)lbu $t1,($a1)bne $t0,$t1,Lrunt13addiu $a0,$a0,1addiu $a1,$a1,1addiu $a2,$a2,-1Lrunt11:bgez $a2,Lrunt12Lrunt10:li $v0,1j $ra# # void print(struct string *s)# {int i; unsigned char *p=s->chars;# for(i=0;i<s->length;i++,p++) putchar(*p);# }print:lw $a1,0($a0)add $a0,$a0,4add $a2,$a0,$a1lb $a3,($a2)sb $0,($a2)li $v0,4syscallsb $a3,($a2)j $ra# void flush()# {# fflush(stdout);# }flush:j $ra# int main()# {int i;# for(i=0;i<256;i++)# {consts[i].length=1;# consts[i].chars[0]=i;# }# return t_main(0 /* static link */);# }.dataRuntconsts: .space 2048Runtempty: .word 0.textmain: li $a0,0la $a1,Runtconstsli $a2,1Lrunt20:sw $a2,($a1)sb $a0,4($a1)addiu $a1,$a1,8slt $a3,$a0,256bnez $a3,Lrunt20li $a0,0j t_main# int ord(struct string *s)# {# if (s->length==0) return -1;# else return s->chars[0];# }ord:lw $a1,($a0)li $v0,-1beqz $a1,Lrunt5lbu $v0,4($a0)Lrunt5:j $ra# struct string empty={0,""};# struct string *chr(int i)# {# if (i<0 || i>=256) # {printf("chr(%d) out of range\n",i); exit(1);}# return consts+i;# }.dataLrunt30: .asciiz "character out of range\n".textchr:andi $a1,$a0,255bnez $a1,Lrunt31sll $a0,$a0,3la $v0,Runtconsts($a0)j $raLrunt31:li $v0,4la $a0,Lrunt30syscallli $v0,10syscall# int size(struct string *s)# { # return s->length;# }size:lw $v0,($a0)j $ra# struct string *substring(struct string *s, int first, int n)# {# if (first<0 || first+n>s->length)# {printf("substring([%d],%d,%d) out of range\n",s->length,first,n);# exit(1);}# if (n==1) return consts+s->chars[first];# {struct string *t = (struct string *)malloc(sizeof(int)+n);# int i;# t->length=n;# for(i=0;i<n;i++) t->chars[i]=s->chars[first+i];# return t;# }# }# .dataLrunt40: .asciiz "substring out of bounds\n"substring:lw $t1,($a0)bltz $a1,Lrunt41add $t2,$a1,$a2sgt $t3,$t2,$t1bnez $t3,Lrunt41add $t1,$a0,$a1bne $a2,1,Lrunt42lbu $a0,($t1)b chrLrunt42:bnez $a2,Lrunt43la $v0,Lruntemptyj $raLrunt43:addi $a0,$a2,4li $v0,9syscallmove $t2,$v0Lrunt44:lbu $t3,($t1)sb $t3,($t2)addiu $t1,1addiu $t2,1addiu $a2,-1bgtz $a2,Lrunt44j $raLrunt41:li $v0,4la $a0,Lrunt40syscallli $v0,10syscall# struct string *concat(struct string *a, struct string *b)# {# if (a->length==0) return b;# else if (b->length==0) return a;# else {int i, n=a->length+b->length;# struct string *t = (struct string *)malloc(sizeof(int)+n);# t->length=n;# for (i=0;i<a->length;i++)# t->chars[i]=a->chars[i];# for(i=0;i<b->length;i++)# t->chars[i+a->length]=b->chars[i];# return t;# }# }concat:lw $t0,($a0)lw $t1,($a1)beqz $t0,Lrunt50beqz $t1,Lrunt51addiu $t2,$a0,4addiu $t3,$a1,4add $t4,$t0,$t1addiu $a0,$t4,4li $v0,9syscalladdiu $t5,$v0,4sw $t4,($v0)Lrunt52:lbu $a0,($t2)sb $a0,($t5)addiu $t2,1addiu $t5,1addiu $t0,-1bgtz $t0,Lrunt52Lrunt53:lbu $a0,($t4)sb $a0,($t5)addiu $t4,1addiu $t5,1addiu $t2,-1bgtz $t2,Lrunt52j $raLrunt50:move $v0,$a1j $raLrunt51:move $v0,$a0j $ra# int not(int i)# { return !i;# }# _not:seq $v0,$a0,0j $ra# #undef getchar# # struct string *getchar()# {int i=getc(stdin);# if (i==EOF) return ∅# else return consts+i;# }.datagetchbuf: .space 200getchptr: .word getchbuf.textgetchar:lw $a0,getchptrlbu $v0,($a0)add $a0,$a0,1bnez $v0,Lrunt6li $v0,8la $a0,getchbufli $a1,200syscallla $a0,getchbuflbu $v0,($a0)bnez $v0,Lrunt6li $v0,-1Lrunt6:sw $a0,getchptrj $ra
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -