assume cs:code,ds:data
data segment
;栈顶指针;栈底指针
s_base dw -1
s_top dw -1
;全局变量
S_MAX_SIZE db 0
ELEM_LEN db 3
;栈的存储空间
MEMORY_SPACE db 1000 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+2],ax
mov ds:[si],ax
add ax,1
mov bx,ax
mov word ptr [bx],0
pop bx
pop ax
ret
;入栈
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
; (DL)=插入元素的值
;返回:(无)
push_s:
push bx
push di
mov ax,ds:[si+2]
add al,ELEM_LEN
mov bx,ax
inc bx
mov di,ds:[si+2]
mov [bx],di
mov ds:[si+2],ax
mov bx,ds:[si+2]
mov [bx],dl
pop di
pop bx
ret
;出栈
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
; (DL)=插入元素的值
;返回:
; (DL)=出栈元素的值
; (AL)=结果 0:失败;1:成功
pop_s:
push bx
mov ax,ds:[si]
mov bx,ds:[si+2]
cmp bx,ax
je pop_s_fail
mov dl,[bx]
add bx,1
mov bx,[bx]
mov ds:[si+2],bx
mov al,1
jmp pop_s_finish
pop_s_fail:
mov al,0
pop_s_finish:
pop bx
ret
;得到栈顶元素值
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:
; (DL)=栈顶元素的值
; (AL)=结果 0:失败;1:成功
get_top_element:
mov ax,ds:[si]
mov bx,ds:[si+2]
cmp bx,ax
je get_top_fail
mov dl,[bx]
mov al,1
jmp get_top_finish
get_top_fail:
mov al,0
get_top_finish:
ret
;销毁栈
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:(无)
destroy_s:
mov word ptr ds:[si+2],-1
mov word ptr ds:[si],-1
ret
;清空栈
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:(无)
clear_s:
push ax
mov ax,ds:[si]
mov ds:[si+2],ax
pop ax
ret
;判断栈是否为空
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:
; (DL)=结果 0:否;1:是
s_empty:
push ax
push bx
mov ax,ds:[si]
mov bx,ds:[si+2]
cmp ax,bx
je set_empty
mov dl,0
jmp sub_s_empty_finish
set_empty:
mov dl,1
sub_s_empty_finish:
pop bx
pop ax
ret
;获得栈的长度
;参数:
; (DS)=栈结构体变量的段地址
; (SI)=栈结构体变量的偏移地址
;返回:
; (DL)=栈的长度
s_len:
push ax
push bx
mov dl,0
mov ax,ds:[si]
mov bx,ds:[si+2]
search_forward:
cmp bx,ax
je s_len_finish
inc dl
inc bx
mov bx,[bx]
jmp search_forward
s_len_finish:
pop bx
pop ax
ret
code ends
end start
[07/09/24] |