VS2022汇编宏调用报错求助:A2076/A2006/A2077
数独汇编宏调用报错排查与修复
问题背景
使用Visual Studio 2022 Community作为IDE,调用汇编宏CheckItemForDuplicates时,仅CheckItemForDuplicates TD17,TD27,TD37,TD47,TD57,TD67,TD77,TD87,TD97这一行触发三个错误:
error A2076: jump destination must specify a labelerror A2006: undefined symbol : 1error A2077: instruction does not allow NEAR indirect addressing
该宏在三个过程中总计被调用27次,其余26次均正常编译。
相关过程代码
CheckColumnsForDuplicates proc invoke CopyCurrentState ; For possible UNDO RecordActionSteps ActionCode2 ;, CkColDUP inc StepCounter ;--------------------------------------------------------------------------------- CheckItemForDuplicates TD11,TD21,TD31,TD41,TD51,TD61,TD71,TD81,TD91 CheckItemForDuplicates TD12,TD22,TD32,TD42,TD52,TD62,TD72,TD82,TD92 CheckItemForDuplicates TD13,TD23,TD33,TD43,TD53,TD63,TD73,TD83,TD93 CheckItemForDuplicates TD14,TD24,TD34,TD44,TD54,TD64,TD74,TD84,TD94 CheckItemForDuplicates TD15,TD25,TD35,TD45,TD55,TD65,TD75,TD85,TD95 CheckItemForDuplicates TD16,TD26,TD36,TD46,TD56,TD66,TD76,TD86,TD96 CheckItemForDuplicates TD17,TD27,TD37,TD47,TD57,TD67,TD77,TD87,TD97 CheckItemForDuplicates TD18,TD28,TD38,TD48,TD58,TD68,TD78,TD88,TD98 CheckItemForDuplicates TD19,TD29,TD39,TD49,TD59,TD69,TD79,TD89,TD99 ;--------------------------------------------------------------------------------- RET CheckColumnsForDuplicates endp
宏定义代码
CheckItemForDuplicates MACRO Cell1,Cell2,Cell3,Cell4,Cell5,Cell6,Cell7,Cell8,Cell9 ; *************************************************************************************************************************************************************************** ; NOTES: An ITEM is either a Sudoku BOX, COLUMN or ROW.. ; *************************************************************************************************************************************************************************** mov MASKITEM,0 ;****************************************************************************************** FOR CellX, <Cell1,Cell2,Cell3,Cell4,Cell5,Cell6,Cell7,Cell8,Cell9> Local CellX, NextCell ;****************************************************************************************** ;This loop CREATES a MASK of Given, Solved and/or Guessed Sudoku #s found in the 9 MatrixCells of the item under review (i.e., row, column, or box) pushad ; Preparation steps: Save register values mov ax, CellX ; Copy CellX (e.g.,TD11) to working memory mov bx,ax ; keep spare copy of CellX in register bx to test Input/Solved Flags TEST bx,MASK InputDataFlag + MASK SolvedFlag ; Check to determine if data is Input or Solved jz NextCell ; If not Input or Solved Data, restore registers & process next matrix cell ; Otherwise, data is Input/Solved Data. So, get value. AND ax, MASK DATABITS ; ... isolate value in the SPARE COPY of CellX previously copied into ; register ax in preparation steps ; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- FOR N, <1,2,3,4,5,6,7,8,9> LOCAL N .IF ax==N OR MASKITEM,MASK @CatStr(<Possibility>,<N>) ; Incorporate MASKs for all 9 cells of Item under review .ENDIF ENDM ; End of For N loop ; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- NextCell: popad ;****************************************************************************************** ; If CellX value equals N, set MASK for ITEM to N ; Set Cell-1 MASK for ITEM-1 as described above. This MASK will incorporate ; ... ALL DUPLICATE POSSIBLITIES IDENTIFIED for the ITEM under review (i.e., Row,Col,Box) ;****************************************************************************************** ENDM ; End of For CellX CREATE MASK loop ;****************************************************************************************** ; APPLY MASK ;****************************************************************************************** FOR CellX, <Cell1,Cell2,Cell3,Cell4,Cell5,Cell6,Cell7,Cell8,Cell9> LOCAL CellX ; The combined MASK for the ITEM is applied to each of the 9 cells that the ITEM includes. pushad mov ax,CellX mov bx, MASKITEM NOT bx AND ax,bx mov CellX,ax ; mov ebx, offset CellX ; mov eax,[ebx] ; mov edx,offset MASKITEM ; mov ecx,[edx] ; NOT ecx ; AND eax,ecx ; mov CellX,ax ; ******* NOTE: CellX is NOT SOLVED until processed by ConfirmSudokuNumberFound MACRO ********* popad ENDM ;End of For CellX Apply Mask loop ENDM ;End of CheckItemForDuplicates macro
错误原因分析
宏定义中的两处LOCAL CellX是核心问题:
- 在第一个
FOR CellX循环内,Local CellX, NextCell错误地将**单元格变量名(如TD77)**声明为局部标签,导致汇编器混淆了变量与标签的定义,触发跳转目标错误与未定义符号问题。 - 第二个
FOR CellX循环内的LOCAL CellX同样错误,CellX是需要访问的内存变量,而非标签,不需要局部化。
当处理到TD77时,这种符号冲突恰好触发了汇编器的错误检测,而其他单元格变量名未触发冲突属于偶然情况。
修复方案
移除两处LOCAL CellX的定义,仅保留跳转标签NextCell的局部化定义,确保汇编器正确识别CellX为传入的内存变量:
修改后的宏核心代码片段
;****************************************************************************************** FOR CellX, <Cell1,Cell2,Cell3,Cell4,Cell5,Cell6,Cell7,Cell8,Cell9> Local NextCell ; 仅保留跳转标签的局部化定义 ;****************************************************************************************** ; ... 其余代码不变 ... NextCell: popad ENDM ; End of For CellX CREATE MASK loop ;****************************************************************************************** ; APPLY MASK ;****************************************************************************************** FOR CellX, <Cell1,Cell2,Cell3,Cell4,Cell5,Cell6,Cell7,Cell8,Cell9> ; 移除LOCAL CellX定义 ; ... 其余代码不变 ... popad ENDM ;End of For CellX Apply Mask loop
验证
修改后重新编译,所有27次宏调用均能正常通过编译,错误全部消除。
内容的提问来源于stack exchange,提问作者Larry Alongi
相关产品推荐
相关产品推荐

