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

8086汇编代码编译出现‘Symbol not defined : @STACK’错误求助

问题原因与解决办法

为什么@DATA可用,@STACK会报错?

在MASM的.MODEL SMALL模式下,只有@DATA是汇编器预定义的符号,用来指代数据段的段地址。而.STACK伪指令只是让汇编器预留指定大小的栈空间,并不会生成@STACK这个预定义符号,所以你引用它时会提示未定义。

解决办法

DOS加载程序时会自动帮你设置好栈段寄存器SS和栈指针SP,你完全不需要手动给SS赋值。直接删掉代码里这两行就行:

MOV  AX,@STACK
MOV  SS,AX

修改后的完整代码

TITLE ADD 10 NUMBERS FROM 50 TO 150
.MODEL SMALL
.STACK 32
.DATA
    ARR  DW 60,70,86,79,70,140,130,120,100,150
    STRING  DB "THE SUM OF NUMBERS IS: $"
    SUM DW ?
.CODE
    MAIN PROC FAR
           MOV  AX,@DATA
           MOV  DS,AX

           LEA  SI,ARR
           MOV  AX,0
           MOV  CX,10
    REPEAT:
           ADD  AX,[SI]
           INC  SI
           INC SI
           LOOP REPEAT

           MOV DX,0
           MOV CX,0
           MOV BX,10

    REPEAT2:
           CMP AX,0
           JZ NEXT
           DIV BX
           PUSH DX
           SUB DX,DX
           INC CX
           JMP REPEAT2

    NEXT:
            CMP CX,0
            JZ EXIT
            POP DX
            ADD DX,30H
            DEC CX
            MOV AH,02H
            INT 21H
            JMP NEXT

    EXIT:
           MOV  AX,4C00H
           INT  21H

MAIN ENDP
    END MAIN

额外说明(如果需要手动控制栈段)

要是你确实需要手动指定栈段,可以放弃.STACK伪指令,自己定义栈段:

STACK_SEG SEGMENT STACK
    DW 16 DUP(?)  ; 32字节,和.STACK 32效果一致
STACK_SEG ENDS

然后在代码里这样赋值:

MOV AX, STACK_SEG
MOV SS, AX

但对你当前的需求来说,完全没必要多此一举。

内容的提问来源于stack exchange,提问作者Bishal Lamichhane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:12:48