📄 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,<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 + -