📄 queue.asm
字号:
;循环队列有关算法
FRONT EQU 2000H ;循环队列存储空间的起始地址。
N EQU 200 ;数组数据元素的个数(不超过255)。
F DATA 3EH ;队首指针的存放单元。
R DATA 3FH ;队尾指针的存放单元。
XH DATA 30H ;待入队数据高字节的存放单元。
XL DATA 31H ;待入队数据低字节的存放单元。
ORG 0000H
LJMP TEST
ORG 100H
TEST: LCALL SETNULL ;初始化空队
MOV XH,#5AH
MOV XL,#6CH
LCALL DATAIN ;数据5A6CH入队
MOV XH,#3CH
MOV XL,#8AH
LCALL DATAIN ;数据3C8AH入队
MOV XH,#13H
MOV XL,#4EH
LCALL DATAIN ;数据134EH入队
MOV XH,#9FH
MOV XL,#3DH
LCALL DATAIN ;数据9F3DH入队
LCALL DATAOUT ;数据5A6CH出队
LCALL DATAOUT ;数据3C8AH出队
LCALL DATAOUT ;数据134EH出队
STOP: LJMP STOP ;队列中还剩一个数据9F3DH
SETNULL:MOV A,#N ;初始化空队,取双字节数组的大小。
DEC A ;减一,指向数组的最后一个单元。
MOV F,A ;使队首指针指向数组的最后一个单元。
MOV R,A ;使队尾指针也指向数组的最后一个单元。
RET ;设置好空队列。
DATAIN: MOV A,R ;数据入队,先取队尾指针的当前值。
INC A ;后移一个单元。
CJNE A,#N,DIN1;超范围否?
CLR A ;返回起始端。
DIN1: CJNE A,F,DIN2;满队否?
SETB C ;满队,入队失败。
SJMP DINE ;结束。
DIN2: MOV R,A ;新队尾有效。
MOV DPTR,#FRONT;取起始地址。
CLR C ;计算偏移量,求得新队尾的绝对地址。
RLC A
JNC DIN3
INC DPH
DIN3: ADD A,DPL
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
MOV A,XH ;取待入队数据的高字节。
MOVX @DPTR,A ;排入队尾。
INC DPTR ;调整地址。
MOV A,XL ;取待入队数据的低字节。
MOVX @DPTR,A ;排入队尾。
CLR C ;入队成功。
DINE: RET ;结束。
DATAOUT:MOV A,F ;数据出队,先取队首指针的当前值。
CJNE A,R,DOUT1;空队否?
SETB C ;空队,出队失败。
SJMP DOUTE ;结束。
DOUT1: INC A ;后移一个单元。
CJNE A,#N,DOUT2;超范围否?
CLR A ;返回起始端。
DOUT2: MOV F,A ;新队首有效。
MOV DPTR,#FRONT;取起始地址。
CLR C ;计算偏移量,求得原队首的绝对地址。
RLC A
JNC DOUT3
INC DPH
DOUT3: ADD A,DPL
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
MOVX A,@DPTR ;取待出队数据的高字节。
MOV XH,A ;放入存放单元。
INC DPTR ;调整地址。
MOVX A,@DPTR ;取待出队数据的低字节。
MOV XL,A ;放入存放单元。
CLR C ;出队成功。
DOUTE: RET ;结束。
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -