You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 label
  • error A2006: undefined symbol : 1
  • error 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是核心问题:

  1. 在第一个FOR CellX循环内,Local CellX, NextCell错误地将**单元格变量名(如TD77)**声明为局部标签,导致汇编器混淆了变量与标签的定义,触发跳转目标错误与未定义符号问题。
  2. 第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:40:54