这是msdos源代码的汇编代码,当我尝试编译该代码时,它显示错误“ MSDOS.ASM(329):错误A2006:未定义符号:AXSAVE”。请guide.please指导我在哪里是错的。我无法理解为什么即使我在结构“ STKPTRS”下声明了变量AXSAVE时也未声明为符号。
CODE SEGMENT
CODE ENDS
CONSTANTS SEGMENT BYTE
CONSTANTS ENDS
DATA SEGMENT WORD
DATA ENDS
DOSGROUP GROUP CODE,CONSTANTS,DATA
SEGBIOS SEGMENT
SEGBIOS ENDS
; BOIS entry point definitions
IF IBM
BIOSSEG EQU 60H
ENDIF
IF NOT IBM
BIOSSEG EQU 40H
ENDIF
; Location of user registers relative user stack pointer
STKPTRS STRUC
AXSAVE DW ? <--MSDOS.ASM(329):error A2006:undefined symbol: AXSAVE
BXSAVE DW ?
CXSAVE DW ?
DXSAVE DW ?
SISAVE DW ?
DISAVE DW ?
BPSAVE DW ?
DSSAVE DW ?
ESSAVE DW ?
IPSAVE DW ?
CSSAVE DW ?
FSAVE DW ?
STKPTRS ENDS
LEAVE:
CLI
MOV SP,CS:[SPSAVE]
MOV SS,CS:[SSSAVE]
MOV BP,SP
MOV BYTE PTR [BP.AXSAVE],AL
IF DSKTEST
MOV AX,CS:[NSP]
MOV CS:[SPSAVE],AX
MOV AX,CS:[NSS]
MOV CS:[SSSAVE],AX
ENDIF
POP AX
POP BX
POP CX
POP DX
POP SI
POP DI
POP BP
POP DS
POP ES
IRET
DATA SEGMENT WORD
; Init code overlaps with data area below
ORG 0
SPSAVE DW ?
SSSAVE DW ?
IF DSKTEST
NSS DW ?
NSP DW ?
ENDIF
DATA ENDS
END
答案 0 :(得分:1)
多个问题。
对于初学者来说,您的代码不在代码段内。这可能会也可能不会使汇编程序感到困惑。另外,FSAVE
是一个错字,您可能想要FSSAVE
。这很重要,因为FSAVE
恰好是一条指令,至少jwasm不喜欢将它作为struct字段。另外,LEAVE
是一条指令,您可能还必须更改该标签。使用该结构需要强制转换或ASSUME
,并且您使用的大小也错误。这个版本与jwasm组装在一起,我没有麻烦要测试:
IBM=0
DSKTEST=1
CONSTANTS SEGMENT BYTE
CONSTANTS ENDS
DATA SEGMENT WORD
DATA ENDS
DOSGROUP GROUP CODE,CONSTANTS,DATA
SEGBIOS SEGMENT
SEGBIOS ENDS
; BOIS entry point definitions
IF IBM
BIOSSEG EQU 60H
ENDIF
IF NOT IBM
BIOSSEG EQU 40H
ENDIF
; Location of user registers relative user stack pointer
STKPTRS STRUC
AXSAVE DW ?
BXSAVE DW ?
CXSAVE DW ?
DXSAVE DW ?
SISAVE DW ?
DISAVE DW ?
BPSAVE DW ?
DSSAVE DW ?
ESSAVE DW ?
IPSAVE DW ?
CSSAVE DW ?
FSSAVE DW ?
STKPTRS ENDS
CODE SEGMENT
_LEAVE:
CLI
MOV SP,CS:[SPSAVE]
MOV SS,CS:[SSSAVE]
MOV BP,SP
MOV (STKPTRS PTR [BP]).AXSAVE,AX
IF DSKTEST
MOV AX,CS:[NSP]
MOV CS:[SPSAVE],AX
MOV AX,CS:[NSS]
MOV CS:[SSSAVE],AX
ENDIF
POP AX
POP BX
POP CX
POP DX
POP SI
POP DI
POP BP
POP DS
POP ES
IRET
CODE ENDS
DATA SEGMENT WORD
; Init code overlaps with data area below
ORG 0
SPSAVE DW ?
SSSAVE DW ?
IF DSKTEST
NSS DW ?
NSP DW ?
ENDIF
DATA ENDS
END