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

📄 swap.s.3b

📁 cfront是最开始c++语言到C语言的转换工具
💻 3B
字号:
	.file	"swap.s.3b"#	ident	"@(#)cls4:lib/task/task/swap.s.3b	1.1"################################################################################# C++ source for the C++ Language System, Release 3.0.  This product# is a new release of the original cfront developed in the computer# science research center of AT&T Bell Laboratories.## Copyright (c) 1991 AT&T and UNIX System Laboratories, Inc.# Copyright (c) 1984, 1989, 1990 AT&T.  All Rights Reserved.## THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE of AT&T and UNIX System#	# Laboratories, Inc.  The copyright notice above does not evidence# any actual or intended publication of such source code.#################################################################################	swap of DEDICATED# call swap(*running_task, *to_run_task, is_new_child, running_is_terminated)# This routine saves the fp and ap in running's t_framep and t_ap.# If running is a SHARED task, we must save its stack size as well,# although the stack does not need to be copied out here.# It then restores to_run's t_framep and t_ap to be the current fp and ap.# If to_run is a new child, it explicitly restores the registers from# New_task_regs, and returns with ret &0.# If to_run is not a new child, it returns with ret &6.# If running_task is TERMINATED, then we don't need to do a save.	.text	.globl swap	.align	4swap:	save &6			# save all user regs (r3-r8)	movw	4(%ap),%r2	# r2 = to_run	movw	12(%ap),%r1	# r1 = running_is_terminated	cmpw	&1,%r1		# if running is TERMINATED	je	.L_RESTORE	# 	skip save	movw	0(%ap),%r1	# r1 = running	# save state of running task, unless it's TERMINATED	movw	%fp,20(%r1)	# running->t_framep = fp	movw	%ap,28(%r1)	# running->t_ap = ap	movw	52(%r1),%r0	# r0 = running->t_mode	cmpw	&2,%r0		# if running->t_mode == SHARED	jne	.L_RESTORE	# the code here to save the t_size is the same as for sswap	subw3	32(%r1),%sp,%r0		# r0 = sp - running->t_basep (bytes)	arsw3	&2,%r0,36(%r1)		# running->t_size = r0 / 4 (int).L_RESTORE:	movw	8(%ap), %r1	# r1 = is_new_child	# restore state of to_run_task	movw	20(%r2),%fp	# fp = to_run->t_framep	movw	28(%r2),%ap	# ap = to_run->t_ap	# if is_new_child, restore registers	cmpw	&1,%r1	je	.L_CHILD	ret	&6		# not a new child.L_CHILD:	# restore registers for new child	# new child task effectively returns from task::task, so we need	# to set the return value to "this"	movw	24(%r2),%r0		# r0 = to_run->th	movw	&New_task_regs,%r2	movw	0(%r2),%r3	movw	4(%r2),%r4	movw	8(%r2),%r5	movw	12(%r2),%r6	movw	16(%r2),%r7	movw	20(%r2),%r8	ret &0#	swap of SHARED# sswap(*running, *prevOnStack, *to_run, is_new_child, running_is_terminated)# This routine saves the fp and ap in running's t_framep and t_ap# and the stack size in t_size.  Then it copies out the target stack # to prevOnStack's t_savearea.  If to_run is not a new child, it then# copies the saved stack of to_run (from t_savearea) to the target stack,# and then restores to_run's t_framep and t_ap to be the current fp and ap.# We don't need to restore state of a child  to_run object, because it's# already in place.# If running_task is TERMINATED, then we don't need to do a save,# and if running_task is TERMINATED and equals prevOnStack, then we don't# have to do the stack copy.	.text	.globl sswap	.align	4sswap:	save &6				# save all user regs (r3-r8)	movw	0(%ap),%r1		# r1 = running	movw	4(%ap),%r4		# r4 = prevOnStack	movw	16(%ap),%r0		# r0 = running_is_terminated	cmpw	&1,%r0			# if running is TERMINATED	je	.L_SKIP			# skip save		#save hw state of running	movw	%fp,20(%r1)		# running->t_framep = fp	movw	%ap,28(%r1)		# running->t_ap = ap	subw3	32(%r1),%sp,%r0		# r0 = sp - running->t_basep (bytes)	arsw3	&2,%r0,36(%r1)		# running->t_size = r0 / 4 (int)	jmp	.L_SAVE.L_SKIP:	#if running is TERMINATED and running == prevOnStack,		#then we can skip the stack copy too	cmpw	%r1,%r4			# if running == prevOnStack	je	.L_REST			#	skip prevOnStack save.L_SAVE:	#copy out target stack to prevOnStack->t_savearea	movw	36(%r4),%r2		# r2 = prevOnStack->t_size (count)	pushw	%r2	call	&1,swap_call_new	# get count bytes of storage	movw	%r0,40(%r4)		# prevOnStack->t_savearea = r0 (to)	movw	%r0, %r1	movw	32(%r4),%r0		# r0 = prevOnStack->t_basep (from)	movblw.L_REST:	movw	12(%ap),%r1		# r1 = is_new_child	cmpw	&1,%r1			# if is_new_child == 1	je	.L6			# 	skip the copy-in loop	#copy into target stack from to_run->t_savearea	movw	8(%ap),%r4		# r4 = to_run	movw	32(%r4),%r1		# r1 = to_run->t_basep (to)	movw	36(%r4),%r2		# r2 = to_run->t_size (count)	# Kick up the %sp if new stack will be taller than current.	alsw3	&2,%r2,%r3		# r3 = new stack height in bytes.	addw2	%r1,%r3			# r3 = target sp	subw2	%sp,%r3			# r3 = r2 - sp	cmpw	%r3,&0			# if r3 > 0, kick up sp	jle	.L3	addw2	%r3,%sp.L3:	movw	40(%r4),%r0		# r0 = to_run->t_savearea (from)	movblw		# restore hw state of to_run	movw	20(%r4),%fp		# fp = to_run->t_framep	movw	28(%r4),%ap		# to_run->t_ap	# finally, delete to_run's t_savearea	movw	40(%r4),%r2		# r2 = to_run->t_savearea	pushw	%r2	call	&1,swap_call_delete	movw	&0,40(%r4)		# to_run->t_savearea = 0.L6:	ret &6

⌨️ 快捷键说明

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