顺序栈的汇编实现
这是栈实现的汇编版本,实现该数据结构是非常简单的.首先我们创建一个AStack.inc文件,它只是创建一个栈型数据结构的结构体,然后在AStack.asm文件中实现了栈式的数据结构.在每个过程中都有很详细的注释,而且代码非常简单:

AStack.inc文件:
;////////////////////////////////////////////////////////////
;AStack.inc文件,用于定义一个栈的结构体.
;////////////////////////////////////////////////////////////
AStack struct
dwSize dword ? ;栈的最大元素个数.
dwTop dword ? ;栈顶位置.
pdwListArray dword ? ;栈内存首地址.
AStack ends
AStack.asm文件:
;////////////////////////////////////////////////////////////
;AStack.asm文件,用于实现顺序栈的数据结构.
;////////////////////////////////////////////////////////////
.386
.model flat,stdcall
option casemap :none
include windows.inc
include irvine32.inc
include AStack.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data
stStack AStack <20,0,0> ;创建一个栈结构的变量.
.code
;////////////////////////////////////////////////////////////
;用于初始化并创建一个栈.成功返回true,否则返回false.
;////////////////////////////////////////////////////////////
Init proc dwSize:dword ;形参为要创建的元素个数.
.if dwSize > 0
push dwSize
pop stStack.dwSize
.else
mov stStack.dwSize,50
.endif
mov stStack.dwTop,0
mov eax,stStack.dwSize
shl eax,2 ;元素个数乘以4,用于分配内存.
invoke GlobalAlloc,GPTR,eax ;分配内存.
or eax,eax
jz quit ;内存分配失败,返回false
mov stStack.pdwListArray,eax
or eax,1 ;返回true.
quit:
ret
Init endp
;////////////////////////////////////////////////////////////
;用于释放栈所占用的内存.
;////////////////////////////////////////////////////////////
Free proc
mov eax,stStack.pdwListArray
or eax,eax
jz quit ;如果没有分配内存,那么不用释放.
invoke GlobalFree,eax ;释放内存.
quit:
xor eax,eax
mov stStack.dwSize,eax
mov stStack.dwTop,eax
ret
Free endp
;////////////////////////////////////////////////////////////
;清除栈中的所有元素的值.
;////////////////////////////////////////////////////////////
Clear proc
mov stStack.dwTop,0 ;栈顶为第一个元素的索引.这时表示栈中没有元素.
ret
Clear endp
;////////////////////////////////////////////////////////////
;将一个值添加进栈顶中.
;////////////////////////////////////////////////////////////
PushVal proc uses esi dwVal:dword
mov eax,stStack.dwTop
cmp eax,stStack.dwSize
jnz next
xor eax,eax
ret ;如果栈满了,那么返回false.
next:
mov esi,stStack.pdwListArray
shl eax,2 ;用于定位栈顶的内存首地址对于栈内存首地址的偏移.
push dwVal
pop dword ptr[esi+eax] ;将值放入栈顶中.
inc stStack.dwTop ;栈顶位置加一.
or eax,1 ;返回true.
ret
PushVal endp
;////////////////////////////////////////////////////////////
;将一个值从栈顶中弹出.
;////////////////////////////////////////////////////////////
PopVal proc uses esi edi pdwVal:ptr dword
mov eax,stStack.dwTop
or eax,eax
jnz next
ret ;如果栈为空,那么返回false.
next:
mov edi,pdwVal
mov esi,stStack.pdwListArray
dec eax
shl eax,2
push dword ptr[esi+eax]
pop dword ptr[edi] ;返回栈顶数值.
dec stStack.dwTop ;栈顶位置减一.
or eax,1
ret
PopVal endp
;////////////////////////////////////////////////////////////
;获取栈顶值.
;////////////////////////////////////////////////////////////
TopValue proc uses esi edi pdwVal:ptr dword
mov eax,stStack.dwTop
or eax,eax
jnz next
ret ;如果栈为空,那么返回false.
next:
mov edi,pdwVal
mov esi,stStack.pdwListArray
dec eax
shl eax,2
push dword ptr[esi+eax]
pop dword ptr[edi] ;返回栈顶值.
ret
TopValue endp
;////////////////////////////////////////////////////////////
;返回栈中有多少个元素.
;////////////////////////////////////////////////////////////
StackLength proc
mov eax,stStack.dwTop
ret
StackLength endp
;////////////////////////////////////////////////////////////
;下面是一个测试顺序栈式的数据结构的程序.
;////////////////////////////////////////////////////////////
main proc
local dwVal:dword
invoke Init,20 ;初始化一个栈.最大元素个数为20.
invoke PushVal,1
invoke PushVal,2
invoke PushVal,3 ;在栈中压入三个数值.
call StackLength ;返回栈中元素个数.
mov ecx,eax
temp1:
invoke PopVal,addr dwVal
mov eax,dwVal
call WriteDec
mov al,' '
call WriteChar
loop temp1 ;用一个循环将栈中所有值弹出,并输出.
call Crlf
call Clear ;清除栈中的所有元素值.
invoke PushVal,1
invoke PushVal,2
invoke PushVal,3
invoke PushVal,4 ;重新压入四个值到栈中.
call StackLength ;返回栈中的元素个数.
mov ecx,eax
temp2:
invoke TopValue,addr dwVal
mov eax,dwVal
call WriteDec
mov eax,' '
call WriteChar ;得到栈顶值,然后输出.
invoke PopVal,addr dwVal
mov eax,dwVal
call WriteDec
mov al,' '
call WriteChar ;弹出栈顶值,然后输出.
loop temp2
call Crlf
invoke Free ;释放栈所占用的内存块.
invoke ExitProcess,NULL
main endp
end main
输出的结果与C++版的栈型数据结构完全相同.
本文来源 我爱IT技术网 http://www.52ij.com/jishu/1759.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
