我创建了一个链表列表程序,允许用户将他/她的值/数字/对象/单词输入到链表中,每个节点都会追加上一个节点。问题是我必须将所有全局变量更改为局部变量。我需要改变的最重要的全局变量如下:
createNewNode PROC
INVOKE heapAlloc, hHeap, 8, dwBytes
mov tailNode,eax
ret
createNewNode ENDP
我需要将其以及其他全局变量更改为局部变量。我怎么做?请协助。我真的需要帮助,因为这会导致我的程序出现很多问题。非常感谢你。
TITLE Linked List Example (LinkedList.asm)
INCLUDE Irvine32.inc
NODE STRUCT
HEADNum BYTE 10 DUP(0)
nextNod DWORD 0
NODE ENDS
HANDLE TEXTEQU <DWORD>
GetProcessHeap PROTO
HeapAlloc PROTO,
hHeap : HANDLE,
dwflags: DWORD,
dwbytes: DWORD
HeapFree PROTO,
hHeap: HANDLE,
dwFlags: DWORD,
lpMem: DWORD
.data
hHeap DWORD ?
dwBytes DWORD ?
spaces BYTE " ", 0
newnodeTitle BYTE " <--ENTER A NEW NODE (YOU CAN TYPE 'ONE' FOR EXAMPLE)--> ",0
nodeHEADMsg BYTE "ENTER THE NODE HEAD: ",0
NodeFound BYTE "<--THE NODE YOU TYPED HAS BEEN FOUND-->",0
deletedMsg BYTE "<--THE NODE HAS BEEN DELETED-->",0
noNode BYTE "<--THERE ARE NO MORE NODES IN MEMORY LINKED LIST-->",0
titleNode BYTE "<--THE FOLLOWING ARE THE LINKED LIST NODES-->",0
nodeHEADInfo BYTE "NODE HEAD: ",0
space BYTE "--------------------------------------------",0
linkedlistTitle BYTE "CHOOSE CHOICE A, B, C, or D: ",0
choiceA BYTE "(A) DISPLAY CURRENT LIST OF NODES",0
choiceB BYTE "(B) ADD NEW NODE",0
choiceC BYTE "(C) DELETE THE NODE IN YOUR LINKED LIST",0
choiceD BYTE "(D) STOP THE LINKED LIST PROGRAM AND QUIT",0
selectChoice BYTE "PLEASE ENTER YOUR DESIRED SELECTION: ",0
getSearchHEAD BYTE "<--PLEASE ENTER THE NODE HEAD THAT YOU WANT TO DELETE: -->",0
gotoRow BYTE 0
gotoColumn BYTE 0
headNode DWORD ?
tailNode DWORD ?
currentNode DWORD ?
previousNode DWORD ?
nextNod DWORD ?
foundNode BYTE 0
HEADNumber BYTE 11 DUP(0)
NodeResponse BYTE ?
searchHEAD BYTE 11 DUP(0)
thisnode NODE {} ;STRUCT
.code
CALLOC MACRO size
push size
call MALLOC
ENDM
LALLOC MACRO size
push eax
mov eax, sizeof DWORD
imul eax, size
push eax
call MALLOC
ENDM
MEMFREE PROC
push ebp
mov ebp, esp
invoke GetProcessHeap
invoke HeapFree, eax, 0, [ebp + 8]
pop ebp
ret 4
MEMFREE ENDP
IALLOC MACRO size
mov eax, sizeof WORD
imul eax, size
push eax
call MALLOC
ENDM
MALLOC PROC
push ebp
mov ebp, esp
invoke GetProcessHeap
invoke HeapAlloc, eax, 8, [ebp + 8]
pop ebp
ret 4
MALLOC ENDP
createColumns PROC
push ebp
mov ebp, esp
add gotoRow,2
mov dl,gotoColumn
mov dh,gotoRow
call gotoxy
pop ebp
ret
createColumns ENDP
createNewNode PROC
INVOKE heapAlloc, hHeap, 8, dwBytes
mov tailNode,eax
ret
createNewNode ENDP
goToHeap PROC
mov esi,OFFSET thisnode
mov edi,currentNode
INVOKE Str_copy, ADDR thisnode.HEADNum, edi
add edi,SIZEOF thisnode.HEADNum
mov eax,(NODE PTR [esi]).nextNod
mov [edi],eax
ret
goToHeap ENDP
linkedListMenu PROC ;--->Displays the list from A to F
call Clrscr
mov gotoRow,0
mov dl,0
mov dh,0
call Gotoxy
mov edx,OFFSET linkedlistTitle ;"CHOOSE CHOICE A, B, C, or D: ",0
call writeString
call createColumns
mov edx, offset space
call writeString
call createColumns
mov edx,OFFSET choiceA ;"A) DISPLAY CURRENT LIST OF NODES",0
call writeString
call createColumns
mov edx,OFFSET choiceB ;"B) ADD NEW NODE",0
call writeString
call createColumns
mov edx,OFFSET choiceC ;"C) DELETE EXISTING NODE",0
call writeString
call createColumns
mov edx,OFFSET choiceD ;"D) EXIT PROGRAM",0
call writeString
ret
linkedListMenu ENDP
displayList PROC ;(A) DISPLAYS THE LIST
mov edi,headNode
mov ebx,00h
call Clrscr
mov edx,OFFSET titleNode ;"<-- LINK LIST CONTENTS -->",0
call writeString
call Crlf
Call Crlf
initialize:
cmp [edi+SIZEOF NODE.HEADNum],ebx
je noNodes
mov eax,[edi]
mov previousNode,eax
call displayNODE
mov edi,[edi]
mov currentNode,edi
JMP initialize
noNodes:
call crlf
call waitMsg
ret
displayList ENDP
displayNODE PROC ;(A) DISPLAYS NODE HEAD:, NODE LAST NAME:
mov edx,edi
call writeString
add edi,SIZEOF thisnode.HEADNum
mov edx,edi
mov edx, OFFSET spaces
call writeString
ret
displayNODE ENDP
GetNodeSelection PROC ;DYNAMIC MEMORY ALLOCATION VIA API CALLS
mov dl,0
mov dh,15
call gotoxy
mov edx, OFFSET selectChoice ;"PLEASE ENTER YOUR DESIRED SELECTION: ",0
call writeString
call readChar
mov NodeResponse,al
INVOKE Str_ucase, ADDR NodeResponse
mov al,'A'
mov bl,'B'
mov cl,'C'
.IF (al == NodeResponse)
call displayList ;DISPLAYS THE CONTENTS
.ELSEIF (bl == NodeResponse)
call userQuery
call goToHeap
call waitMsg ;AFTER LOOP ENDS, THIS WILL DISPLAY A "Press 'Enter' to continue..."
.ELSEIF (cl == NodeResponse)
call getNodeSearch
.IF (foundNode == 1)
call deleteNode
.ENDIF
call waitMsg
.ENDIF
ret
GetNodeSelection ENDP
userQuery PROC ;(C) ADD NEW NODE
call Clrscr
mov edx,OFFSET newnodeTitle
call writeString
call Crlf
call Crlf
mov edx,OFFSET nodeHEADMsg ;"ENTER THE node HEAD: ",0
call writeString
mov edx,OFFSET thisnode.HEADNum
mov ecx,10
call readString
call createNewNode
mov eax,tailNode
mov thisnode.nextNod,eax
ret
userQuery ENDP
getNodeSearch PROC ;(B) SEARCH NODE
call ClrScr
mov ebx,00h
mov edi,headNode
cmp [edi+SIZEOF NODE.HEADNum],ebx
je nothing
mov edx,OFFSET getSearchHEAD ;"PLEASE ENTER THE node HEAD TO DISPLAY: ",0
call writeString
mov edx,OFFSET searchHEAD ;"PLEASE ENTER THE node HEAD TO DISPLAY: ",0
mov ecx,10
call readString
call searchList
jmp endprocedure
nothing:
mov foundNode,0
mov edx,OFFSET noNode
call writeString
endprocedure:
call crlf
ret
getNodeSearch ENDP
searchList PROC ;PLEASE ENTER THE node HEAD TO DISPLAY:
call ClrScr
mov edi,headNode
mov ebx,00h
mov previousNode,edi
discoverLoop:
mov eax,[edi]
INVOKE Str_compare, ADDR searchHEAD, edi
je discovered
mov previousNode,edi
add edi,SIZEOF NODE.HEADNum
mov edi,[edi]
cmp [edi+SIZEOF NODE.HEADNum],ebx
je NOTdiscovered
jmp discoverLoop
discovered:
mov foundNode,1
mov currentNode,edi
Call Crlf
mov edx,OFFSET NodeFound
call writeString
call displayNODE
jmp awayNode
NOTdiscovered:
mov foundNode,0
call Crlf
awayNode:
ret
searchList ENDP
deleteNode PROC
mov edi,currentNode
add edi,SIZEOF NODE.HEADNum ;(SIZEOF NODE.lastNam + SIZEOF NODE.HEADNum)
mov eax,[edi]
mov nextNod,eax
mov edi,currentNode
.if(edi == headNode)
mov headNode,eax
.endif
mov edi,previousNode
add edi,SIZEOF NODE.HEADNum ;(SIZEOF NODE.lastNam + SIZEOF NODE.HEADNum)
mov eax,nextNod
mov [edi],eax
mov edi,currentNode
INVOKE heapFree, hHeap, 8, edi
call Crlf
mov edx,OFFSET deletedMsg ;" --- AND REMOVED ---",0
call writeString
call Crlf
ret
deleteNode ENDP
main PROC
call MALLOC ;----------->dynamically allocating memory
INVOKE GetProcessHeap;------>returns a handle to the heap in eax
mov hHeap,eax
mov dwBytes,SIZEOF NODE
call createNewNode
mov headNode,eax
startPoint:
mov eax,tailNode
mov currentNode,eax
call linkedListMenu
call GetNodeSelection
cmp NodeResponse, 'D'
jne startPoint
call crlf
call waitMsg
ENDOFPROGRAM: exit
call memfree ;---------->freeing the allocated memory
main ENDP
end main