Многочисленные проблемы.
Для начала, ваш код не находится внутри сегмента кода. Это может или не может запутать ассемблер. Кроме того, 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