You should provide the code here, so we can inspect it.
Gunther
Don't use masm 5.1, there was a big change between versions 5 and 6.
yes - now, that you mention it...
i recall seeing some OPTION directives in the masm 6 manual for assembling older programs
Quote from: Gunther on December 29, 2010, 01:12:06 PM
You should provide the code here, so we can inspect it.
Gunther
The lines of two files are more than 300,and the code description is not written by english,so I delete these description,look:
;FileName:386SCD.ASM
DESCRIPTOR STRUC
LIMITL DW 0
BASEL DW 0
BASEM DB 0
ATTRIBUTES DW 0
BASEH DB 0
DESCRIPTOR ENDS
;-------------------------------------------------------
GATE STRUC
OFFSETL DW 0
SELECTOR DW 0
DCOUNT DB 0
GTYPE DB 0
OFFSETH DW 0
GATE ENDS
;--------------------------------------------------------
PDESC STRUC
LIMIT DW 0
BASE DD 0
PDESC ends
;-----------------------------------------------------------
TASKSS STRUC
TRLINK DW ?,0
TRESP0 DD ?
TRSS0 DW ?,0
TRESP1 DD ?
TRSS1 DW ?,0
TRESP2 DD ?
TRSS2 DW ?,0
TRCR3 DD ? ;CR3
TREIP DD ? ;EIP
TREFLAG DW ?,? ;EFLAGS
TREAX DD ? ;EAX
TRECX DD ? ;ECX
TREDX DD ? ;EDX
TREBX DD ? ;EBX
TRESP DD ? ;ESP
TREBP DD ? ;EBP
TRESI DD ? ;ESI
TREDI DD ? ;EDI
TRES DW ?,0 ;ES
TRCS DW ?,0 ;CS
TRSS DW ?,0 ;SS
TRDS DW ?,0 ;DS
TRFS DW ?,0 ;FG
TRGS DW ?,0 ;GS
TRLDT DW ?,0 ;LDT
TRFLAG DW 0
TRIOMAP DW $+2
TASKSS ENDS
;--------------------------------------------------------------
ATDR = 90H
ATDW = 92H
ATDWA = 93H
ATCE = 98H
ATCER = 9AH
ATCCO = 9CH
ATCCOR = 9EH
;
ATLDT = 82H
ATTASKGAT = 85H
AT386TSS = 89H
AT386CGAT = 8CH
AT386IGAT = 8EH
AT386TGAT = 8FH
;------------------------------------------------------------------
;
DPL1 = 20H ;DPL=1
DPL2 = 40H ;DPL=2
DPL3 = 60H ;DPL=3
RPL1 = 01H ;RPL=1
RPL2 = 02H ;RPL=2
RPL3 = 03H ;RPL=3
IOPL1 = 1000H ;IOPL=1
IOPL2 = 2000H ;IOPL=2
IOPL3 = 3000H ;IOPL=3
;-------------------------------------------------------
;
D32 = 4000H
TIL = 04H
VMFL = 0002H
IFL = 0200H
;-----------------------------------------------
;
JUMP32 MACRO selector, offsetv
DB 0EAH
DW offsetv
DW 0
DW selector
ENDM
;-----------------------------------------------
;
CALL32 MACRO selector, offsetv
DB 9AH
DW offsetv
DW 0
DW selector
ENDM
;----------------------------------------------
;
JUMP16 MACRO selector, offsetv
DB 0EAH
DW offsetv
DW selector
ENDM
;---------------------------------------------
;
CALL16 MACRO selector, offsetv
DB 9AH
DW offsetv
DW selector
ENDM
;FileName:T10.ASM
INCLUDE 386SCD.ASM
.386P
;-------------------------------------------
GDTSEG SEGMENT PARA USE16 'GDT'
GDT LABEL BYTE
DUMMY DESCRIPTOR <>
;
NORMAL DESCRIPTOR <0FFFFH,0,0,ATDW,0>
NORMAL_SEL = NORMAL - GDT
;
CODEK DESCRIPTOR <0FFFFH,,,ATCE,>
CODEK_SEL = CODEK - GDT
;
LDTABLE DESCRIPTOR <LDTLEN-1,,,ATLDT,>
LDT_SEL = LDTABLE - GDT
GDTLEN = $ - GDT ;;;;;;;;;;;;;;
GDTSEG ENDS
;------------------------------------------------
LDTSEG SEGMENT PARA USE16 'LDT'
LDT LABEL BYTECODEL
;
CODEL DESCRIPTOR <CODELLEN-1,SEG CODELSEG,,ATCE,>
CODEL_SEL = (CODEL-LDT) + TIL
;
CODEC DESCRIPTOR <CODECLEN-1,SEG CODECSEG,,ATCE,>
CODEC_SEL = (CODEC-LDT) + TIL
;
VIDEOBUFF DESCRIPTOR <0FFFFH,0,0,0F00H+ATDW,0>
VIDEO_SEL = (VIDEOBUFF-LDT) + TIL
;
TOLDT DESCRIPTOR <LDTLEN-1,LDTSEG,,ATDR+DPL3,>
TOLDT_SEL = (TOLDT-LDT) + TIL
;
MDATA DESCRIPTOR <MDATALEN-1,SEG MDATASEG,,ATDW+DPL3,>
MDATA_SEL = (MDATA-LDT) + TIL + RPL3
;
STACKS DESCRIPTOR <TOPOFS-1,SEG STACKSEG,,ATDWA,>
STACK_SEL = (STACKS-LDT) + TIL
LDNUM = ($-LDT) / (SIZE DESCRIPTOR)
LDTLEN = $ - LDT
LDTSEG ENDS
;--------------------------------------------
;
MDATASEG SEGMENT PARA USE16 'MDATA'
MESSAGE DB 'Value=',0
BUFFER db 80 dup (0)
MDATALEN = $ - MDATASEG
MDATASEG ENDS
;--------------------------------------------
;
STACKSEG SEGMENT PARA USE16 'STACK'
DW 512 DUP (0)
TOPOFS = $ - STACKSEG
STACKSEG ENDS
;--------------------------------------------
;
CODECSEG SEGMENT PARA USE16 'CODEC'
ASSUME CS:CODECSEG
DISPMESS PROC FAR
MOV AH,7
DISP1:MOV AL,FS:[SI]
INC SI
OR AL,AL
JZ DISP2
MOV ES:[EDI],AX
INC EDI
INC EDI
JMP DISP1
DISP2:RET
DISPMESS endp
;
;
HTOASC PROC FAR
AND AL,0FH
ADD AL,90H
DAA
ADC AL,40H
DAA
ret
HTOASC endpCODECLEN = $ - CODECSEG
CODECSEG ENDS
;----------------------------------------------
;
CODELSEG SEGMENT PARA USE16 'CODEL'
ASSUME CS:CODELSEG
VIRTUAL2:
MOV AX,VIDEO_SEL
MOV ES,AX
MOV EDI,0B8000H
;
MOV AX,MDATA_SEL
MOV FS,AX
MOV SI,OFFSET MESSAGE
;
CALL16 CODEC_SEL,DISPMESS
;
MOV AX,TOLDT_SEL
MOV GS,AX
;
MOV DX,GS:[CODEL.LIMITL]
MOV SI,OFFSET BUFFER
MOV CX,4
VIR:ROL DX,4
MOV AL,DL
CALL16 CODEC_SEL,HTOASC
MOV FS:[SI],AL
INC SI
LOOP VIR
MOV WORD PTR FS:[SI],'H'
;
MOV SI,OFFSET BUFFER
CALL16 CODEC_SEL,DISPMESS
;
JUMP16 CODEK_SEL,VIRTUAL3
CODELLEN = $ - CODELSEG
CODELSEG ENDS
;-----------------------------------------------------
;
CODEKSEG SEGMENT PARA USE16 'CODEK'
ASSUME CS:CODEKSEG
VIRTUAL1:
MOV AX,LDT_SEL
LLDT AX
;
MOV AX,STACK_SEL
MOV SS,AX
MOV SP,OFFSET TOPOFS
;
JUMP16 CODEL_SEL,VIRTUAL2
VIRTUAL3:
MOV AX,NORMAL_SEL
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
;
MOV EAX,CR0
AND EAX,0FFFFFFFEH
MOV CR0,EAX
JUMP16 <SEG REAL>,<OFFSET REAL>
CODEKLEN = $ - CODEKSEG
CODEKSEG ENDS
;=======================================================
;
RDATASEG SEGMENT PARA USE16
VGDTR PDESC <GDTLEN-1,>
SPVAR DW ?
SSVAR DW ?
RDATASEG ENDS
;------------------------------
;
RECODESEG SEGMENT PARA USE16
ASSUME CS:RECODESEG
START: jmp $
ASSUME DS:GDTSEG
MOV AX,GDTSEG
MOV DS,AX
;
MOV BX,16
MOV AX,CODEKSEG
MUL BX
MOV CODEK.BASEL,AX
MOV CODEK.BASEM,DL
MOV CODEK.BASEH,DH
MOV AX,LDTSEG
MUL BX
MOV LDTABLE.BASEL,AX
MOV LDTABLE.BASEM,DL
MOV LDTABLE.BASEH,DH
;
ASSUME DS:RDATASEG
MOV AX,RDATASEG
MOV DS,AX
MOV AX,GDTSEG
MUL BX
MOV WORD PTR VGDTR.BASE,AX
MOV WORD PTR VGDTR.BASE+2,DX
;
CLD
CALL INIT_MLDT
;
MOV SSVAR,SS
MOV SPVAR,SP
;
LGDT FWORD PTR VGDTR
CLI
;
MOV EAX,CR0
OR EAX,1
MOV CR0,EAX
JUMP16 <CODEK_SEL>,<OFFSET VIRTUAL1>
REAL:
LSS SP,DWORD PTR SPVAR
STI
MOV AX,4C00H
INT 21H
;-----------------------------------------
;
INIT_MLDT PROC
PUSH DS
MOV AX,LDTSEG
MOV DS,AX
MOV CX,LDNUM
MOV SI,OFFSET LDT ;CODEL(SI=0)
INITL:MOV AX,[SI].BASEL
MOVZX EAX,AX
SHL EAX,4
SHLD EDX,EAX,16
MOV [SI].BASEL,AX
MOV [SI].BASEM,DL
MOV [SI].BASEH,DH
ADD SI,SIZE DESCRIPTOR ;
LOOP INITL
POP DS
ret
INIT_MLDT endp
RECODESEG ENDS
END START
see attached...