📄 joseph.asm
字号:
;******************************************************
;* 文件名:Joseph.asm
;* 创建日期:2001.7.30
;* 作者:陈文尧
;* 功能:测试未来汇编队列库函数
;* 备注:1.本程序是由本人大学时代的C++程序(约瑟夫环)改编
;* 2.原来C++程序是用循环链表实现的,现在用队列模拟
;* 3.本程序的问题描述如下:
;* N个人围坐一圈,每人持一密码(正整数)。开始
;* 选一报数上限M(正整数),从第一人开始报数,到M时
;* 停止。报M的人出列,把他的密码作为新的M值,从他
;* 的下一个人开始从1报数,如此下去,直到全部出列
;******************************************************
include system.inc
include queue.inc
;******************************************************
;* 以下代码由汇编专家产生,不要随便修改
;******************************************************
.CODE
ifdef __COM__
org 100h
endif
@@Start:
;------------------------------------------------------
; 初始化数据段
;------------------------------------------------------
InitDS cs
;------------------------------------------------------
; 释放多余内存
;------------------------------------------------------
ModifyMemory ;xxx
;------------------------------------------------------
; 调用主函数
;------------------------------------------------------
call main
;------------------------------------------------------
; 正常返回DOS
;------------------------------------------------------
@@Exit:
ReturnDos
;++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+ 主函数,加入实现程序功能的代码
;++++++++++++++++++++++++++++++++++++++++++++++++++++++
main proc
LibCall CreateQueue,<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
LibCall EnQueue,<offset ring>,<offset node>
cmp si,di
jb @Input
DisplayMessage msg5
@Next:
LibCall DeQueue,<offset ring>,<offset node>
dec bx
jz @Print
LibCall EnQueue,<offset ring>,<offset node>
jmp @Next
@Print:
mov bx,node.password
LibCall PutInteger,node.sequence
LibCall QueueLength,<offset ring>
or ax,ax
jz short @Return
LibCall PutChar,','
jmp @Next
@Return:
;事实上到这里,队列已空,不调用ClearQueue也可以
LibCall ClearQueue,<offset ring>
;
ret
main endp
SNODE struc
password dw ?
sequence dw ?
ends
node SNODE ?
ring FQUEUE <>
msg1 db '输入报数上限值:$'
msg2 db '输入人数:$'
msg3 db '输入第$'
msg4 db '人的密码:$'
msg5 db '出列循序如下:$'
;******************************************************
;* 标志程序结束并指定程序入口
;******************************************************
end @@Start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -