assume cs:code,ds:data
data segment
;全局变量
STACK_INIT_SIZE db 20
;栈的数据结构
s_base dw -1
s_top dw -1
stack_size db 0
;栈分配的空间
MEMORY_SPACE db 100 dup (0)
data ends
code segment
start:
;调用初始化栈子程序
mov ax,data
mov ds,ax
mov si,offset s_base
call init_s
;调用入栈子程序,设入栈字符为'a'
mov ax,data
mov ds,ax
mov si,offset s_base
mov dl,'a'
call push_s
;调用入栈子程序,设入栈字符为'b'
mov ax,data
mov ds,ax
mov si,offset s_base
mov dl,'b'
call push_s
;调用出栈子程序
mov ax,data
mov ds,ax
mov si,offset s_base
call pop_s
;调用获得最顶元素子程序
mov ax,data
mov ds,ax
mov si,offset s_base
call get_top_element
;调用判断栈是否为空子程序
mov ax,data
mov ds,ax
mov si,offset s_base
call s_empty
;调用获得栈的长度子程序
mov ax,data
mov ds,ax
mov si,offset s_base
call s_len
;调用清空栈子程序
mov ax,data
mov ds,ax
mov si,offset s_base
call clear_s
;调用销毁栈子程序
mov ax,data
mov ds,ax
mov si,offset s_base
call destroy_s
mov ax,4c00h
int 21h
;初始化栈
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:(无)
init_s:
push ax
push bx
mov ax,offset MEMORY_SPACE
mov ds:[si],ax
mov ds:[si+2],ax
mov al,STACK_INIT_SIZE
mov ds:[si+4],al
pop bx
pop ax
ret
;入栈
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
; (DL)=插入元素的值
;返回:
; (AL)=结果 0:失败;1:成功
push_s:
push bx
mov ax,ds:[si+2]
sub ax,ds:[si]
cmp al,ds:[si+4]
je push_fail
mov bx,ds:[si+2]
mov byte ptr [bx],dl
inc word ptr ds:[si+2]
mov al,1
jmp push_finish
push_fail:
mov al,0
push_finish:
pop bx
ret
;出栈
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:
; (DL)=出栈元素的值
; (AL)=结果 0:失败;1:成功
pop_s:
push bx
mov ax,ds:[si+2]
mov bx,ds:[si]
cmp ax,bx
je pop_fail
dec word ptr ds:[si+2]
mov bx,ds:[si+2]
mov dl,[bx]
mov al,1
jmp pop_finish
pop_fail:
mov al,0
pop_finish:
pop bx
ret
;获得最顶元素值
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:
; (DL)=栈顶元素的值
; (AL)=结果 0:失败;1:成功
get_top_element:
push bx
mov bx,ds:[si+2]
cmp bx,ds:[si]
je get_elem_fail
dec bx
mov dl,[bx]
mov al,1
jmp get_elem_finish
get_elem_fail:
mov al,0
get_elem_finish:
pop bx
ret
;销毁栈
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:(无)
destroy_s:
mov word ptr ds:[si+2],-1
mov word ptr ds:[si],-1
mov byte ptr ds:[si+4],0
ret
;清空栈
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:(无)
clear_s:
push ax
mov ax,ds:[si]
mov ds:[si+2],ax
pop ax
ret
;判断栈是否为空
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:
; (AL)=结果 0:否;1:是
s_empty:
mov ax,ds:[si]
cmp ax,ds:[si+2]
je set_empty
mov al,0
jmp s_empty_finish
set_empty:
mov al,1
s_empty_finish:
ret
;获得栈的长度
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:
; (DL)=栈的长度
s_len:
push ax
push bx
mov ax,ds:[si]
mov bx,ds:[si+2]
sub bx,ax
mov dl,bl
pop bx
pop ax
ret
code ends
end start
[07/09/22] |