📄 alloc.s
字号:
/ storage allocator for use with C//// hand-tooled from C compilation to modify save-return/ so that it can be called from within the C save/ when running with coroutines//#//*/ * C storage allocator/ * (circular first fit strategy)/ *//#define BLOK 512/#define BUSY 01//char *allocs[2] { /*initial empty arena*// &allocs[1],/ &allocs[0]/};/struct { int word; };/char **allocp &allocs[1]; /*current search pointer*//char **alloct &allocs[1]; /*top of arena (last cell)*///alloc(nbytes)/{/ register int nwords;/ register char **p, **q;/ static char **t;// allocs[0].word =| BUSY; /*static initialization*// allocs[1].word =| BUSY;// nwords = (nbytes+(2*sizeof(p)-1))/sizeof(p);/ for(p=allocp;;) {/ do {/ if((p->word&BUSY)==0) {/ while(((q = *p)->word&BUSY)==0)/ *p = *q;/ if(q >= &p[nwords])/ goto found;/ }/ q = p;/ p = p->word & ~BUSY;/ } while(q>=allocp || p<allocp);/ if((*alloct=t=sbrk(BLOK*sizeof(p))) == -1)/ return(-1);/ if(t!=alloct+1)/ alloct->word =| BUSY;/ alloct = (*t = &t[BLOK]-1);/ *alloct = allocs;/ alloct->word =| BUSY;/ }/found:/ allocp = &p[nwords];/ if(q>allocp)/ *allocp = *p;/ *p = allocp.word|BUSY;/ return(p+1);/}//free(p)/char **p;/{/ allocp = p-1;/ allocp->word =& ~BUSY;/}.globl _allocs.data_allocs=.2+_allocs_allocs.globl _allocp.data_allocp=.2+_allocs.globl _alloct.data_alloct=.2+_allocs.globl _alloc.globl _sbrk.text_alloc:mov r5,-(sp)mov sp,r5mov r4,-(sp)mov r3,-(sp)mov r2,-(sp)bis $1,_allocsbis $1,2+_allocsmov 4(r5),r4add $3,r4asr r4mov _allocp,r3jbr L6L7:mov r3,r2mov (r3),r3bic $!177776,r3cmp r2,_allocpjhis L6cmp r3,_allocpjlo L6mov $2000,-(sp)jsr pc,*$_sbrktst (sp)+mov r0,tmov r0,*_alloctcmp $177777,r0jeq L11mov _alloct,r0add $2,r0cmp t,r0jeq L12bis $1,*_alloctL12:mov t,r0add $1776,r0mov r0,*tmov r0,_alloctmov $_allocs,*_alloctbis $1,*_alloctL6:bit $1,(r3)jeq L8jbr L7L20001:mov (r2),(r3)L8:mov (r3),r2bit $1,(r2)jeq L20001mov r4,r0asl r0add r3,r0cmp r2,r0jlo L7mov r4,r0asl r0add r3,r0mov r0,_allocpcmp r2,r0jlos L13mov (r3),*_allocpL13:mov _allocp,r0bis $1,r0mov r0,(r3)mov r3,r0add $2,r0L11:mov (sp)+,r2mov (sp)+,r3mov (sp)+,r4mov (sp)+,r5rts pc.globl _free.text_free:mov r5,-(sp)mov sp,r5mov 4(r5),r0add $177776,r0mov r0,_allocpbic $!177776,*_allocpmov (sp)+,r5rts pc.bsst: .=.+2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -