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