Когда я пытаюсь скомпилировать ниже данного кода сборки, он дает неопределенный символ ошибки: AXSAVE - PullRequest
0 голосов
/ 05 ноября 2019

вот код ассемблера для исходного кода 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

1 Ответ

1 голос
/ 05 ноября 2019

Многочисленные проблемы.

Для начала, ваш код не находится внутри сегмента кода. Это может или не может запутать ассемблер. Кроме того, FSAVE это опечатка, вы, вероятно, хотите FSSAVE. Это важно, потому что FSAVE является инструкцией, и, по крайней мере, jwasm не любит это как поле структуры. Также LEAVE - это инструкция, вам, возможно, придется изменить и эту метку. Для использования структуры требуется приведение или ASSUME, и вы также используете неправильный размер. Эта версия собирается с 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
...