首页 > 解决方案 > 当我试图在给定的汇编代码下编译时,它给出了错误未定义的符号:AXSAVE

问题描述

这是msdos源代码的汇编代码,当我尝试编译代码时,它显示错误“MSDOS.ASM(329):错误A2006:未定义符号:AXSAVE”。请指导。请指导我哪里错了。我无法理解为什么它将变量 AXSAVE 声明为未定义符号,即使我已在结构“STKPTRS”下声明它。

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

标签: assemblyx86-16

解决方案


多个问题。

对于初学者,您的代码不在代码段内。这可能会或可能不会混淆汇编程序。另外,FSAVE是一个错字,你可能想要FSSAVE. 这很重要,因为FSAVE恰好是一条指令,至少 jwasm 不喜欢它作为结构字段。也是LEAVE一个指令,您可能还必须更改该标签。使用 struct 需要强制转换或 anASSUME并且您还使用了错误的大小。这个版本用 jwasm 组装,我没有 masm 来测试:

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

推荐阅读