|
|
1.1 ! root 1: # enter(&prog,arg) ! 2: # will execute prog(arg) and return zero ! 3: # if a "leave(str)" is executed, an immediate return ! 4: # from the caller to the lowest level enter will be ! 5: # executed, and will return(str) to the caller of enter. ! 6: ! 7: .globl _write ! 8: .globl _exit ! 9: ! 10: .text ! 11: ! 12: .globl _enter ! 13: _enter: ! 14: .word 0 ! 15: pushl savesp # save previous stack pointer ! 16: pushl fp # save the current frame pointer ! 17: movl sp,savesp # the saved stack pointer ! 18: pushl 8(ap) # fetch the argument ! 19: calls $1,*4(ap) # call the function ! 20: clrl r0 # normal return ! 21: rtn: ! 22: movl savesp,sp # get old stack ! 23: movl (sp)+,fp # and old fp ! 24: movl (sp)+,savesp # and restore old exit ! 25: ret ! 26: ! 27: .globl _leave ! 28: ! 29: _leave: ! 30: .word 0 ! 31: movl 4(ap),r0 # fetch return value ! 32: tstl savesp ! 33: bneq rtn # and exit ! 34: pushl $18 ! 35: pushl $msg ! 36: pushl $2 ! 37: calls $3,_write ! 38: clrl -(sp) ! 39: calls $1,_exit ! 40: ! 41: .data ! 42: msg: ! 43: .ascii "bad call to leave\12" ! 44: ! 45: .text ! 46: .lcomm savesp,4
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.