当我尝试在给定的汇编代码下进行编译时,它给出了错误的未定义符号:AXSAVE

这是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
lingcy 回答:当我尝试在给定的汇编代码下进行编译时,它给出了错误的未定义符号:AXSAVE

多个问题。

对于初学者来说,您的代码不在代码段内。这可能会也可能不会使汇编程序感到困惑。另外,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
本文链接:https://www.f2er.com/3159053.html

大家都在问