www.pudn.com > Demo_asm_80x86.rar > Joseph1.asm


;****************************************************** 
;* 文件名:Joseph1.asm 
;* 创建日期:2001.7.31 
;* 作者:陈文尧 
;* 功能:测试未来汇编环(双向循环链表)库函数 
;* 备注:“环”这个数据结构是我自己命名的,事实上也就是 
;*      双向循环链表。在数据结构上,有些结构从实现角度 
;*      来说是相同的,但从逻辑角度来说是绝对不同。比如 
;*      栈、队列同链表的关系,无论用动态还是静态来实现 
;*      前两者都是后者的特例,然而却把它们区分为不同的 
;*      数据结构,这是因为从逻辑角度来说它们是不同的。 
;*      “环”是一种没有开始也没有结束,没有绝对位置却 
;*      只有相对位置的数据结构。它和链表(或者循环链表) 
;*      从逻辑角度来说是绝对不同的。 
;****************************************************** 
include system.inc 
include Ring.inc 
;****************************************************** 
;* 以下代码由汇编专家产生,不要随便修改 
;****************************************************** 
.CODE 
	ifdef __COM__ 
		org	100h 
	endif 
@@Start: 
;------------------------------------------------------ 
; 初始化数据段 
;------------------------------------------------------ 
	InitDS	cs 
;------------------------------------------------------ 
; 释放多余内存 
;------------------------------------------------------ 
	ModifyMemory	;xxx 
;------------------------------------------------------ 
; 调用主函数 
;------------------------------------------------------ 
	call	main 
;------------------------------------------------------ 
; 正常返回DOS 
;------------------------------------------------------ 
@@Exit: 
	ReturnDos 
 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
;+ 主函数,加入实现程序功能的代码 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
main	proc 
	LibCall		CreateRing,,04h 
	 
	DisplayMessage	msg1 
	LibCall		GetInteger 
	mov			bx,ax 
	 
	DisplayMessage	msg2 
	LibCall		GetInteger 
	mov			di,ax 
 
	sub			si,si 
@Input: 
	inc			si 
	DisplayMessage	msg3 
	LibCall		PutInteger,si 
	DisplayMessage	msg4 
	LibCall		GetInteger 
	mov			node.password,ax 
	mov			node.sequence,si 
	; 
	;把结点插到当前结点的前面,有点不好理解。 
	;然而仔细一想,恰恰是这样才会把各结点依次插入, 
	;而当前结点为第一个插入的结点(当环是空的,结点插入时当前结点自动指向它)。 
	;或者用一个好理解的方法: 
	;    用"rngInsertAfter"和"rngMoveBy,,1"来替代, 
	;  全部插入完之后再调用一次"rngMoveBy,,1" 
	;  使当前结点指向第一个插入的结点 
	; 
	LibCall		rngInsertBefore,, 
	cmp			si,di 
	jb			@Input 
 
	DisplayMessage	msg5 
 
@Next: 
	dec			bx 
	; 
	;当前移动结点N(这儿是bx)个位置。N正则向后,N负则向前 
	; 
	LibCall		rngMoveBy,,bx 
	; 
	;可以用rngSetValue设置当前结点的值,本例子没用到它 
	; 
	LibCall		rngGetValue,, 
	mov			bx,node.password 
	LibCall		PutInteger,node.sequence 
	;删除当前结点,之后当前结点指向前当前结点的后一个结点 
	LibCall		rngDelete, 
	LibCall		rngLength, 
	or			ax,ax 
	jz			short	@Return 
	LibCall		PutChar,',' 
	jmp			@Next 
	 
@Return: 
	;事实上到这里,环已空,不调用ClearRing也可以 
	LibCall		ClearRing, 
	; 
	ret 
main	endp 
 
SNODE		struc 
		password	dw	? 
		sequence	dw	? 
		ends 
 
node		SNODE		? 
ring		FRING		<> 
msg1		db		'输入报数上限值:$' 
msg2		db		'输入人数:$' 
msg3		db		'输入第$' 
msg4		db		'人的密码:$' 
msg5		db		'出列循序如下:$' 
;****************************************************** 
;* 标志程序结束并指定程序入口 
;****************************************************** 
	end	@@Start