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
相关产品推荐
相关产品推荐

