链式栈的汇编实现
该程序是链式栈的汇编版本,它包含两个文件:LStack.inc和LStack.asm文件,前者用于定义一个栈节点的结构体,而后者用于创建一个链式栈.下面是源码:

LStack.inc文件:
;////////////////////////////////////////////////////////////
;LStack.inc文件:它定义了一个节点的结构体.
;////////////////////////////////////////////////////////////
LStack struct
value dword ? ;数值域
next dword ? ;指针域.
LStack ends
pLStack typedef ptr LStack ;结构体类型的指针类型.
LStack.asm文件:
;////////////////////////////////////////////////////////////
;LStack.asm文件:它实现了汇编语言的链式栈的数据结构.
;////////////////////////////////////////////////////////////
.386
.model flat,stdcall
option casemap :none
include windows.inc
include irvine32.inc
include LStack.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data
pstLStack pLStack NULL ;栈顶指针.
dwSize dword 0 ;栈中节点数.
.code
;////////////////////////////////////////////////////////////
;初始化栈顶指针.
;////////////////////////////////////////////////////////////
Init proc
mov pstLStack,NULL ;指针初始化为NULL
mov dwSize,0 ;还没有节点.
ret
Init endp
;////////////////////////////////////////////////////////////
;清空一个栈的所有节点.
;////////////////////////////////////////////////////////////
Free proc uses esi ebx
mov esi,pstLStack
.while esi
mov ebx,esi
mov esi,(LStack ptr[esi]).next
invoke GlobalFree,ebx ;逐个清除栈中的节点.
.endw
ret
Free endp
;////////////////////////////////////////////////////////////
;重建一个栈,它调用了上面的两个函数,实现重建一个栈.
;////////////////////////////////////////////////////////////
Clear proc
call Free ;清除栈中的所有节点.
call Init ;初始化这个栈,用于再重载一个新的栈.
ret
Clear endp
;////////////////////////////////////////////////////////////
;将一个数值入栈.
;////////////////////////////////////////////////////////////
PushValue proc uses esi dwVal:dword
invoke GlobalAlloc,GPTR,sizeof LStack
or eax,eax
jz quit
mov esi,pstLStack
push dwVal
pop (LStack ptr[eax]).value ;赋值.
mov (LStack ptr[eax]).next,esi ;将新建的节点的后继节点为当前的栈顶节点.
mov pstLStack,eax ;重新调整栈顶指针.
inc dwSize ;节点数加一.
or eax,1 ;返回true.
quit: ;反回false.
ret
PushValue endp
;////////////////////////////////////////////////////////////
;将一个值从栈中弹出.
;////////////////////////////////////////////////////////////
PopValue proc uses esi ebx pdwVal:ptr dword
mov esi,pstLStack
or esi,esi
jnz next
xor eax,eax
ret ;如果栈中没有节点了,那么返回false.
next:
mov ebx,pdwVal
push (LStack ptr[esi]).value
pop dword ptr[ebx] ;得到要删除节点的值.
mov ebx,esi ;得到要删除节点的指针.
mov esi,(LStack ptr[esi]).next
mov pstLStack,esi ;栈顶指针指向下一个节点.
invoke GlobalFree,ebx ;删除节点所占内存.
dec dwSize ;节点数减一.
or eax,1 ;返回true.
ret
PopValue endp
;////////////////////////////////////////////////////////////
;得到栈顶值.
;////////////////////////////////////////////////////////////
TopValue proc uses esi ebx pdwVal:ptr dword
mov esi,pstLStack
or esi,esi
jnz next
xor eax,eax
ret ;如果栈空,那么返回false.
next:
mov ebx,pdwVal
push (LStack ptr[esi]).value
pop dword ptr[ebx] ;得到栈顶节点的值.
or eax,1 ;返回true.
ret
TopValue endp
;////////////////////////////////////////////////////////////
;得到节点数.
;////////////////////////////////////////////////////////////
StackLength proc
mov eax,dwSize
ret
StackLength endp
;////////////////////////////////////////////////////////////
;下面的代码用于测试链式栈的汇编语言代码的功能.
;////////////////////////////////////////////////////////////
main proc
local dwVal:dword
call Clear ;初始化一个栈.
invoke PushValue,1
invoke PushValue,2
invoke PushValue,3 ;将三个数值压入栈中.
call StackLength
mov ecx,eax ;得到节点数.
temp1:
push ecx
invoke PopValue,addr dwVal
mov eax,dwVal
call WriteDec
mov al,' '
call WriteChar
pop ecx
loop temp1 ;逐个弹出节点,而且输出.
call Crlf
call Clear ;初始化一个栈.
invoke PushValue,1
invoke PushValue,2
invoke PushValue,3
invoke PushValue,4 ;将四个数值压入栈中.
call StackLength
mov ecx,eax
temp2:
push ecx
invoke TopValue,addr dwVal
mov eax,dwVal
call WriteDec
mov al,' '
call WriteChar ;得到栈顶数值,然后输出.
invoke PopValue,addr dwVal
mov eax,dwVal
call WriteDec
mov al,' '
call WriteChar ;弹出栈顶,然后输出.
pop ecx
loop temp2
call Crlf
call Free ;释放栈所占用的所有节点的指针.
invoke ExitProcess,NULL
main endp
end main
它的输出与链式栈的C++实现的输出结构完全相同.
本文来源 我爱IT技术网 http://www.52ij.com/jishu/1756.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
