⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coroutine.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
/*#@(#)coroutine.c	4.1	Ultrix	7/17/90*/# $Header: coroutine.c,v 1.5 84/05/19 11:39:41 powell Exp $# Modula-2 coroutine implementation subroutines# This file is named .c to avoid accidental deletion# A "process" is represented by an area defined as follows:#   Note:  stack grows downward, so process variable points to end.#	Name	Offset	function	.set	status,	-4	# indicate whether process has started.set	entry,	-8	# entry point for process.set	size,	-12	# size of stack area in bytes.set	savesp,	-16	# saved sp of process.set	stack,	-40	# start of stack area for new process.data# currently running process, initially the main program.globl	_SYSTEM_currentprocess_SYSTEM_currentprocess:	.long	_SYSTEM_currentprocessstate	.long	0	# savesp = ?	.long	0x7fffffff	# size = large	.long	0	# entry = none	.long	1	# status = running_SYSTEM_currentprocessstate:.text.globl	_SYSTEM_newprocess_SYSTEM_newprocess:	.word	0	movl	8(ap),r1	# stack area for process	ashl	$-3,12(ap),12(ap)  # convert size from bits to bytes	subl2	12(ap),r1	# point to end of stack area	clrl	status(r1)	# indicate process not yet started	movl	4(ap),entry(r1)	# entry point of process	movl	12(ap),size(r1)	# size of stack	movl	r1,*16(ap)	# use stack record as process object	ret.set	ALLREGMASK,16383	# mask to save r0-fp.globl	_SYSTEM_transfer_SYSTEM_transfer:	.word	0	pushr	$ALLREGMASK	movl	_SYSTEM_currentprocess,r1	# get current process	movl	*8(ap),r2	# process to switch to (var parameter!)	movl	sp,savesp(r1)	# save stack pointer for old process	movl	r1,*4(ap)	# return pointer to old process	movl	r2,_SYSTEM_currentprocess	# new process to run	tstl	status(r2)	# has new process been run before?	jeql	firsttime	# no, start it	# run new process	movl	savesp(r2),sp	# restore stack pointer	popr	$ALLREGMASK	retfirsttime:	# start process at procedure	movl	$1,status(r2)	# indicate running	movl	entry(r2),r3	# get starting address	movab	stack(r2),fp	# set frame pointer	movl	fp,sp		#  and stack pointer	calls	$0,(r3)		# enter procedure#  will return here if procedure terminates.  terminate whole program	clrl	r0	.globl	_exit	calls	$0,_exit

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -