📄 stack.asm
字号:
;用户堆栈的有关算法
STACK EQU 1FH ;堆栈所在页面。
BOTTOM EQU 00H ;栈底单元。
N EQU 200 ;堆栈空间范围的字节数。
TOP DATA 3EH ;栈顶指针。
ORG 0000H
LJMP TEST
ORG 100H
TEST: LCALL SETNULL ;初始化空栈
MOV A,#5AH
LCALL DPUSH ;数据5AH入栈
MOV A,#8DH
LCALL DPUSH ;数据8DH入栈
MOV A,#3CH
LCALL DPUSH ;数据3CH入栈
LCALL DPOP ;数据3CH出栈
LCALL DPOP ;数据8DH出栈
LCALL DPOP ;数据5AH出栈
STOP: LJMP STOP ;用户堆栈已空
SETNULL:MOV A,#BOTTOM;初始化空栈,取栈底单元位置。
MOV TOP,A ;使栈顶指针指向栈底。
RET ;设置好空栈。
DPUSH: MOV B,A ;保护待入栈数据。
MOV A,TOP ;数据入栈,先取栈顶指针的当前值。
INC A ;后移一个单元。
CJNE A,#N,PUSH1;满栈否?
SETB C ;满栈,入栈失败。
SJMP PUSHE ;结束。
PUSH1: MOV TOP,A ;新栈顶有效。
MOV DPH,#STACK;取堆栈所在页面。
MOV DPL,TOP ;取栈顶单元位置。
MOV A,B ;取待入栈数据。
MOVX @DPTR,A ;压入栈顶。
CLR C ;入栈成功。
PUSHE: RET ;结束。
DPOP: MOV A,TOP ;数据出栈,先取栈顶指针的当前值。
CJNE A,#BOTTOM,POP1;空栈否?
SETB C ;空栈,出栈失败。
SJMP POPE ;结束。
POP1: MOV DPH,#STACK;取堆栈所在页面。
MOV DPL,TOP ;取栈顶单元。
MOVX A,@DPTR ;取出栈顶元素。
DEC TOP ;指向新的栈顶。
CLR C ;出栈成功。
POPE: RET ;结束。
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -