|
|
1.1 ! root 1: //////// ! 2: / Scount is called as follows: ! 3: / mov bx, address of m_flst ! 4: / call count ! 5: / It simply increments the count field, and if it was not already ! 6: / on the list pointed to by `_fnclst', it places it there. ! 7: / We also compare the stack pointer to the lowest sp previously ! 8: / encountered and save the lower. ! 9: / Note that because of the strange calling sequence, and the need ! 10: / for speed, the file scount.s is a hand modified version of the C ! 11: / compiler output. The modifications are as follows: ! 12: / Remove the epilog and prolog. ! 13: / Recode to use scratch registers. ! 14: / Change routine name from scount_ to scount. ! 15: / The C source is as follows: ! 16: / ! 17: / #include "mon.h" ! 18: / ! 19: / struct m_flst *_fnclst; ! 20: / struct m_hdr _mhdr; ! 21: / ! 22: / scount(pc, flp) ! 23: / vaddr_t pc; /* actually passed in (sp) */ ! 24: / register struct m_flst *flp; /* actually passed in bx */ ! 25: / { ! 26: / ++flp->m_data.m_ncalls; ! 27: / if (&pc < _mhdr.m_lowsp) ! 28: / _mhdr.m_lowsp = &pc; ! 29: / if (flp->m_link == NULL) { ! 30: / flp->m_link = _fnclst; ! 31: / _fnclst = flp; ! 32: / flp->m_data.m_addr = pc; ! 33: / } ! 34: / } ! 35: ! 36: .shri ! 37: ! 38: .globl scount ! 39: ! 40: scount: ! 41: add 0x02(bx), $0x01 ! 42: adc 0x04(bx), $0x00 ! 43: cmp sp, _mhdr_+0x08 ! 44: jae L2 ! 45: mov _mhdr_+0x08, sp ! 46: ! 47: L2: cmp 0x06(bx), $0x00 ! 48: jne L1 ! 49: mov ax, _fnclst_ ! 50: mov 0x06(bx), ax ! 51: mov _fnclst_, bx ! 52: pop ax ! 53: push ax ! 54: mov (bx), ax ! 55: ! 56: L1: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.