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

📄 joseph1.asm

📁 80X86的一些例子程序
💻 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,<offset ring>,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,<offset ring>,1"来替代,
	;  全部插入完之后再调用一次"rngMoveBy,<offset ring>,1"
	;  使当前结点指向第一个插入的结点
	;
	LibCall		rngInsertBefore,<offset ring>,<offset node>
	cmp			si,di
	jb			@Input

	DisplayMessage	msg5

@Next:
	dec			bx
	;
	;当前移动结点N(这儿是bx)个位置。N正则向后,N负则向前
	;
	LibCall		rngMoveBy,<offset ring>,bx
	;
	;可以用rngSetValue设置当前结点的值,本例子没用到它
	;
	LibCall		rngGetValue,<offset ring>,<offset node>
	mov			bx,node.password
	LibCall		PutInteger,node.sequence
	;删除当前结点,之后当前结点指向前当前结点的后一个结点
	LibCall		rngDelete,<offset ring>
	LibCall		rngLength,<offset ring>
	or			ax,ax
	jz			short	@Return
	LibCall		PutChar,','
	jmp			@Next
	
@Return:
	;事实上到这里,环已空,不调用ClearRing也可以
	LibCall		ClearRing,<offset ring>
	;
	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

⌨️ 快捷键说明

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