LinkedList Assembly x86 MASM中的全局到局部变量

时间:2017-05-29 03:12:10

标签: list assembly linked-list x86 masm

我创建了一个链表列表程序,允许用户将他/她的值/数字/对象/单词输入到链表中,每个节点都会追加上一个节点。问题是我必须将所有全局变量更改为局部变量。我需要改变的最重要的全局变量如下:

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

0 个答案:

没有答案