Assembly 在过程中调用过程会给出;错误A2006:未定义的符号;

Assembly 在过程中调用过程会给出;错误A2006:未定义的符号;,assembly,masm,irvine32,Assembly,Masm,Irvine32,我从未发布过堆栈溢出,也不确定是否正确发布 我不熟悉使用MASM,我正在做一个项目,在Windows8操作系统上使用VisualStudio2012创建一个十六进制游戏。我们计划在C++中添加UI界面,因此我们正在调用程序,但不知道为什么每次调用过程时都会得到这个未定义的错误符号。 另外,在proc(即TotalSearch)中访问邻接数组时,我们是传入一个指向邻接数组本身的指针,还是传入我们声明的指针 例如,TotalSearch过程代码头现在为: TotalSearch PROC PUBLI

我从未发布过堆栈溢出,也不确定是否正确发布

我不熟悉使用MASM,我正在做一个项目,在Windows8操作系统上使用VisualStudio2012创建一个十六进制游戏。我们计划在C++中添加UI界面,因此我们正在调用程序,但不知道为什么每次调用过程时都会得到这个未定义的错误符号。 另外,在proc(即TotalSearch)中访问邻接数组时,我们是传入一个指向邻接数组本身的指针,还是传入我们声明的指针

例如,TotalSearch过程代码头现在为:

TotalSearch PROC PUBLIC, AP:PTR DWORD, AI:SDWORD
其中AP是邻接数组的apointer 因此,它是通过以下方式调用的:

INVOKE TotalSearch, adjptr, arrayindex
是否应该以这种方式调用它,以便传入数组的偏移量,而不是实际指针本身?如果是这样的话,如果这些是传入的参数,是否还需要指针

这是阵列:

adjacency SDWORD 6 DUP (0)
应该是这个电话吗

INVOKE TotalSearch, adjacency, arrayindex
以下是每次调用过程时我都会遇到的错误:

1>------ Build started: Project: ASM_Project, Configuration: Debug Win32 ------
1>  Assembling ShaneMain.asm...
1>ShaneMain.asm(75): error A2006: undefined symbol : ShowBoardColors

1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\BuildCustomizations\masm.targets(49,5): error MSB3721: The command "ml.exe /c /nologo /Zi /Fo"Debug\ShaneMain.obj" /Fl"ASM_Project.lst" /I "c:\Irvine" /W3 /errorReport:prompt  /TaShaneMain.asm" exited with code 1.


========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
这是我们的代码。有些行被注释掉了,因为我尝试了不同的东西来构建它,但是没有一行成功。此外,您是否可以将声明的常量用作proc(即红石)中的参数?我正在尝试,但无法判断是否可以,因为它无法构建

TITLE AssemblyHex    (AssemblyHEX.asm)
;.586       ;needed to use INVOKE and work with C/C++
;.model flat, C ;needed to use INVOKE and work with C/C++
;.386
;.model flat,STDCALL

INCLUDE Irvine32.inc

PDWORD TYPEDEF PTR DWORD

;constants declared
visited equ 3; constant to identify visited hex
redStone equ 1  ;constant to identify hex with red stone==>visted red == 4
blueStone equ 2 ;constant to identify hex with blue==>visited blue ==5
emptyH EQU 0 ;constant to identify empty hex ????needed??


;=================================
;   DATA
;=================================

.data
;======macro for determining row/column
;===after is called row/column of current hex are put in global variable
_RowColumn MACRO
PUSH EAX
PUSH EDX ;push all registers
CDQ ;zero out edx
mov eax,arrayindex  ;move arrayindex to eAX
idiv boardsize ;divide array index by boardsize
mov row,eax
mov column,edx
POP EDX
POP EAX
ENDM
;======macro for determining row/column



bptr PDWORD board
adjptr PDWORD adjacency

ALIGN SDWORD

board SDWORD 121 DUP (0)
adjacency SDWORD 6 DUP (0)
arrayindex SDWORD 0
row SDWORD 0
column SDWORD 0
;redStone DWORD 1   ;variable to identify hex with red stone==>visted red == 4
;blueStone DWORD 2  ;variable to identify hex with blue==>visited blue ==5

redprompt BYTE "Choose an unoccupied hex to place a red stone: ", 0
blueprompt BYTE "Choose an unoccupied hex to place a blue stone: ", 0
invalidhex BYTE "Invalid hex selection! ", 0
isOnBoard DWORD 0 ;variable for if index is on the board 1==yes 0==no
hexState DWORD 0 ;variable for hex state 0==empty, visited==3, red==1, blue==2
boardsize DWORD 11 ;constant to identify board size
totalHexes DWORD 121 ;constant to identify total hexes
;---------------------------------

;=================================
;   MAIN
;=================================
.code

main PROC 

;=================================
START:


PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX
PUSH ESI
INVOKE TotalSearch, adjptr, arrayindex
POP ESI
POP EDX
POP ECX
POP EBX
POP EAX

jmp start



EXIT

main ENDP



;=================================
;   TotalSearch
;=================================
;   Starts at current arrayindex and visits every hex on the board (traverses entire graph).
;
;   Arguments: adjptr(AP), arrayindex(AI)
;   Registers used:
;   Calls: 
;=================================
    ;TotalSearch(adjptr, arrayindex)
TotalSearch PROC PUBLIC, AP:PTR DWORD, AI:SDWORD

; Start at current arrayindex.

; Label current hex as discovered.


PUSH EAX
PUSH EDX
PUSH ESI
INVOKE GetHexState, adjptr, arrayindex
POP ESI
POP EDX
POP EAX

PUSH EAX
PUSH ECX
PUSH ESI
ADD eAx, 3

INVOKE SetHexState, bptr, arrayindex
POP ESI
POP ECX
POP EAX

MOV eSi, OFFSET adjacency
MOV eCx, LENGTHOF adjacency
MOV eBx, TYPE adjacency

CALL DumpMem

CALL Crlf

PUSH EAX
PUSH EBX
PUSH ECX
INVOKE ShowBoard, arrayindex, boardsize
POP ECX
POP EBX
POP EAX

CALL Crlf

; Loop: for all neighbors of current hex, do
; if hex is not discovered, then
; send that hex index to arrayindex and call TotalSearch

MOV eSi, AP

MOV eCx, 6

TOP:
MOV eAx, [eSi];=====================?????????????????????????
MOV AI, eAx

; check if discovered

PUSH EAX
PUSH ESI
PUSH EDX
INVOKE GetHexState, adjptr, arrayindex
POP EDX
POP ESI
POP EAX

CMP hexState, 3
JAE NEXT

PUSH EAX
PUSH ESI
PUSH ECX
PUSH EBX
INVOKE TotalSearch,adjptr,arrayindex 
POPAD
POP EBX
POP ECX
POP ESI
POP EAX

NEXT:
ADD eSi, 4
LOOP TOP

; If at initial hex and no unvisited neighbors (loop completes), return to main.


RET

TotalSearch ENDP

END main

问题是,您从未定义过程的入口点。您需要添加一个带有过程名称的标签来标识入口点。比如说:

        :
ShowBoardColors PROC PUBLIC, AI:SDWORD, BS:SDWORD

; entry point at the beginning of the procedure
ShowBoardColors:

; set array index to 0 and initialize two loop counters in eBx and eCx

mov eax,AI
MOV eax, 0
        :

在调用
ShowBoardColors
时,尚未定义或声明它。你需要提前申报。(另外,你需要把你的代码减少到最小的程序来演示这个问题。)哦。我看到过其他帖子,其中告诉人们应该发布整个代码,而不仅仅是一个片段。如何做远期申报?我已经搜索了很长一段时间,没有找到任何看起来像我需要做的事情……我尝试了Shane,Main.inc文件,其中列出了所有的proto,如下所示:;HexGame程序(ShaneMain.inc)的包含文件包括Irvine32.inc ADJP:PTR DWORD;邻接数组指针AI:SDWORD;ArrayIndex发布整个代码以演示问题,但这包括删除与问题无关的代码。你想用最小的程序来显示问题。