⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os1.asm

📁 是关于保护模式与实模式之间的相互切换,是用汇编写的源程序
💻 ASM
字号:
.MODEL HUGE
STACK     SEGMENT STACK PARA 'STACK'
          DB 200 DUP(0)
STACK     ENDS
Include   G_DEF.ASM
CODE      SEGMENT WORD PUBLIC 'CODE'
          ASSUME  CS:CODE, DS:DATA, SS:STACK
MODE_CHANGE  PROC FAR
START:
          MOV AX,DATA
          MOV DS,AX
          CLI
          MOV AX,STACK
          MOV SS,AX
          MOV SAVE_SS,AX
          MOV SP,200
          MOV SAVE_SP,SP
          STI
          MOV DS:FILE_OVER,1
          .386P
          CALL OPEN_A20
          SGDT FWORD PTR SAVE_GDT
          SIDT FWORD PTR SAVE_IDT
          MOV  DI,OFFSET DAT:GDT_CS
          MOV  AX,Code1
          MOV  CX,10H
          MUL  CX
          MOV  DAT:[DI].BASE_L,AX
          MOV  DAT:[DI].BASE_M,DL

          MOV DI,OFFSET DAT:GDT_DS
          MOV DX,0
          MOV AX,DS
          MOV CX,10H
          MUL CX
          MOV DAT:[DI].BASE_L,AX
          MOV DAT:[DI].BASE_M,DL
          MOV DAT:[DI].BASE_H,DH

          MOV DI,OFFSET DAT:GDT_SS
          MOV AX,SS
          MOV CX,10H
          MUL CX
          MOV DAT:[DI].BASE_L,AX
          MOV DAT:[DI].BASE_M,DL

          MOV DI,OFFSET DAT:GDT_BUF
          MOV DAT:[DI].BASE_L,0
          MOV DAT:[DI].BASE_H,020H
          MOV DAT:[DI].GRAN,0FH

          CLI
          MOV AX,DS
          MOV CX,10H
          MUL CX
          ADD AX,OFFSET GDT_DEF
          ADC DX,0
          MOV DTLOAD,AX
          MOV DTLOAD+2,DX
          MOV AX,OFFSET GDT_SIZE
          SUB AX,OFFSET DTSIZE
          ADD AX,1
          MOV DTSIZE,AX
          MOV DS:G_BUF_SUM,0
          MOV AX,3D02H
          LEA DX,FILE_NAME
          INT 21H
          JNC READ_FILE0
          LEA DX,ERR_FILE
          MOV AH,9
          INT 21H
          MOV AH,4CH
          INT 21H

READ_FILE0: MOV DS:FILE_HANDLE,AX
READ_FILE:
            MOV DS:SAVE_SS,SS
            MOV DS:SAVE_SP,SP
            SGDT FWORD PTR SAVE_GDT
            SIDT FWORD PTR SAVE_IDT
            MOV BX,DS:FILE_HANDLE
            MOV CX,1024
            MOV DX,OFFSET C_BUFFER
            MOV AH,3FH
            INT 21H
            JNC READ_FILE1
            MOV AX,0
            MOV DS:C_BUF_SIZE,AX
            MOV DS:FILE_OVER,AX
            MOV AH,3EH
            INT 21H
            JMP PROTECT_MODE
READ_FILE1: MOV DS:C_BUF_SIZE,AX
            CMP AX,1024
            JNL PROTECT_MODE
            MOV DS:FILE_OVER,0
            MOV BX,DS:FILE_HANDLE
            MOV AH,3EH
            INT 21H
            JMP PROTECT_MODE
REAL_MODEO:
            CALL CLOSE_A20
            MOV AX,DATA
            MOV DS,AX
            LGDT FWORD PTR SAVE_GDT
            LIDT FWORD PTR SAVE_IDT
            CLI
            MOV SS,SAVE_SS
            MOV SP,SAVE_SP
            STI
            JMP READ_FILE
PROTECT_MODE:
            CLI
            LGDT FWORD PTR DTSIZE
            MOV AX,GDT_DS_SEL
            MOV DS,AX
            MOV ES,AX
            MOV FS,AX
            MOV GS,AX
            STI
            MOV EAX,00000001H
            MOV CR0,EAX
            JMP EDS_FLUSH
EDS_FLUSH:  DB  0EAH
            DW  OFFSET MOVE_BUF
            DW  GDT_CS_SEL
CODE ENDS











CODE1 SEGMENT WORD PUBLIC 'CODE1'
MOVE_BUF:
            MOV AX,GDT_DS_SEL
            MOV FS,AX
            MOV GS,AX
            CMP FS:C_BUF_SIZE,1
            JL  VRAM_DISP
            MOV ECX,0
            MOV CX,FS:C_BUF_SIZE
            MOV EAX,OFFSET C_BUFFER
            MOV ESI,EAX
            MOV EDI,FS:G_BUF_SUM
MOVE_BUF1:  MOV AL,FS:[ESI]
            MOV GS:[EDI],AL
            INC EDI
            INC ESI
            LOOP MOVE_BUF1

            MOV FS:G_BUF_SUM,EDI
            CMP FS:FILE_OVER,1
            JL VRAM_DISP
            CLI
            MOV EAX,CR0
            AND AX,NOT PE_ON
            MOV CR0,EAX
            DB 0EAH
            DW OFFSET REAL_MODEO
            DW CODE

VRAM_DISP:
            MOV AX,GDT_DS_SEL
            MOV FS,AX
            MOV AX,GDT_BUF_SEL
            MOV GS,AX
            MOV AX,VRAM_SEL
            MOV ES,AX
            MOV BX,0
L1:         MOV ES:[BX],0720H
            ADD BX,2
            LOOP L1
            MOV ECX,FS:G_BUF_SUM
            CMP ECX,2048
            JL  LL
            MOV ECX,2048
LL:         MOV ESI,0
            MOV EBX,480
L2:         MOV AL,GS:[ESI]
            MOV AH,22
            MOV ES:[EBX],AX
            ADD EBX,2
            INC ESI
            LOOP L2

            CLI
            MOV EAX,CR0
            AND AX,NOT PE_ON
            MOV CR0,EAX
            DB  0EAH
            DW  OFFSET REAL_MODE
            DW  CODE
REAL_MODE:  TO_DOS
            .8086
MODE_CHANGE ENDP
INCLUDE     A20.ASM
CODE1  ENDS

DATA    SEGMENT  WORD  PUBLIC 'DATA'
FILE_NAME      DB  'MODE.TXT'
FILE_HANDLE    DW  0
FILE_OVER      DW  0
ERR_FILE       DB  0DH,0AH, 'Open file error$'
OK_MSG         DB  0DH,0AH, 'Have a nice day,Bye!   $'
SAVE_GDT       DW  4  DUP(0)
SAVE_IDT       DW  4  DUP(0)
SAVE_SS        DW  0
SAVE_SP        DW  0
DTSIZE         DW  0
DTLOAD         DW  0,0
GDT_SIZE       DW  0
C_BUF_SIZE     DW  0
G_BUF_SUM      DD  0
C_BUFFER       DB  1024 DUP(?)
DATA           ENDS









DAT    SEGMENT  WORD  PUBLIC 'DATA1'
GDT_DEF        EQU $
               GDT_DESC <0,0,0,0,0,0>
GDT_CS         GDT_DESC <0FFFFH,0,0,9AH,0,0>
GDT_DS         GDT_DESC <0FFFFH,0,0,9AH,0,0>
GDT_SS         GDT_DESC <0,0,0,96H,0,0>
GDT_VRM        GDT_DESC <0FFFFH,08000H,0BH,92H,0,0>
GDT_BUF        GDT_DESC <0FFFFH,0,0,92H,0,0>

               END START




















































            




























































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -