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

📄 asm6.asm.txt

📁 hen hao de yi guai ruanjian
💻 TXT
📖 第 1 页 / 共 2 页
字号:
;----------------------------------------------------------------------------
EchoBegin    PROC  FAR
        push  ax            ;保护现场
        push  ds
        push  es
        mov   ax,EchoData_Sel      ;置显示过程数据段
        mov   ds,ax
        mov   ax,Video_Sel       ;置视频缓冲区数据段
        mov   es,ax
        mov   ax,WORD PTR Mess
        mov   WORD PTR es:[0],ax
        pop   es
        pop   ds
        pop   ax
        iretd
EchoBegin    ENDP
;----------------------------------------------------------------------------
EchoCodeLen   =    $
EchoCodeSeg   ENDS
;----------------------------------------------------------------------------
;演示任务的堆栈段
;----------------------------------------------------------------------------
DemoStackSeg  SEGMENT PARA USE16
DemoStackLen  =    1024
        DB   DemoStackLen DUP(0)
DemoStackSeg  ENDS
;----------------------------------------------------------------------------
;演示任务的数据段
;----------------------------------------------------------------------------
DemoDataSeg   SEGMENT PARA USE16
Flag      DB   0
DemoDataLen   =    $
DemoDataSeg   ENDS
;----------------------------------------------------------------------------
;演示任务的代码段
;----------------------------------------------------------------------------
DemoCodeSeg   SEGMENT PARA USE16
        ASSUME CS:DemoCodeSeg,DS:DemoDataSeg
;----------------------------------------------------------------------------
DemoBegin    PROC  FAR
        mov   ax,DemoStack_Sel     ;置堆栈
        mov   ss,ax
        mov   sp,DemoStackLen      ;置数据段
        mov   ax,DemoData_Sel
        mov   ds,ax
        mov   es,ax
        mov   fs,ax
        mov   gs,ax
        mov   al,11111110b       ;置中断屏蔽字
        out   IMREGP,al         ;只开发时钟中断
        sti                ;开中断
DemoConti:   cmp   BYTE PTR Flag,0      ;判标志
        jz   DemoConti         ;直到不为0
        cli                ;关中断
        ;转回临时代码段,准备回实方式
        JUMP16 TempCode_Sel,<OFFSET ToDos>
DemoBegin    ENDP
;----------------------------------------------------------------------------
DemoCodeLen   =    $
DemoCodeSeg   ENDS
;----------------------------------------------------------------------------
TempCodeSeg   SEGMENT PARA USE16        ;临时任务的代码段
        ASSUME CS:TempCodeSeg
;----------------------------------------------------------------------------
Virtual     PROC  FAR
        JUMP16 DemoCode_Sel,DemoBegin  ;转演示任务
ToDos:     mov   ax,Normal_Sel       ;恢复实方式段描述符高速缓存
        mov   ds,ax
        mov   es,ax
        mov   fs,ax
        mov   gs,ax
        mov   ss,ax
        mov   eax,cr0          ;准备返回实模式
        and   al,11111110b
        mov   cr0,eax
        JUMP16 <SEG Real>,<OFFSET Real>
Virtual     ENDP
;----------------------------------------------------------------------------
TempCodeSeg   ENDS
;============================================================================
RDataSeg    SEGMENT PARA USE16        ;实方式数据段
VGDTR      PDesc  <GDTLen-1,>        ;GDT伪描述符
VIDTR      PDesc  <IDTLen-1,>        ;IDT伪描述符
NORVIDTR    PDesc  <3ffh,>          ;用于保存原IDTR值
SPVar      DW   ?             ;用于保存实方式下的SP
SSVar      DW   ?             ;用于保存实方式下的SS
IMaskRegV    DB   ?             ;用于保存原中断屏蔽寄存器值
RDataSeg    ENDS
;----------------------------------------------------------------------------
RCodeSeg    SEGMENT PARA USE16        ;实方式代码段
        ASSUME CS:RCodeSeg,DS:RDataSeg
;----------------------------------------------------------------------------
Start      PROC
        mov   ax,RDataSeg
        mov   ds,ax
        cld
        call  InitGDT          ;初始化全局描述符表GDT
        call  InitIDT          ;初始化中断描述符表IDT
        mov   SSVar,ss         ;保存堆栈指针
        mov   SPVar,sp
        sidt  QWORD PTR NORVIDTR    ;保存IDTR
        in   al,IMREGP
        mov   BYTE PTR IMaskRegV,al
        lgdt  QWORD PTR VGDTR      ;装载GDTR
        cli                ;关中断
        lidt  QWORD PTR VIDTR      ;装载IDTR
        mov   eax,cr0
        or   al,1
        mov   cr0,eax
        JUMP16 <TempCode_Sel>,<OFFSET Virtual>
Real:      mov   ax,RDataSeg
        mov   ds,ax
        lss   sp,DWORD PTR SPVar    ;又回到实方式
        lidt  QWORD PTR NORVIDTR
        mov   al,IMaskRegV
        out   IMREGP,al
        sti
        mov   ax,4c00h
        int   21h
Start      ENDP
;----------------------------------------------------------------------------
InitGDT     PROC
        push  ds
        mov   ax,GDTSeg
        mov   ds,ax
        mov   cx,GDNum
        mov   si,OFFSET EFFGDT
InitG:     mov   ax,[si].BaseL
        movzx  eax,ax
        shl   eax,4
        shld  edx,eax,16
        mov   WORD PTR [si].BaseL,ax
        mov   BYTE PTR [si].BaseM,dl
        mov   BYTE PTR [si].BaseH,dh
        add   si,SIZE Desc
        loop  InitG
        pop   ds
        mov   bx,16
        mov   ax,GDTSeg
        mul   bx
        mov   WORD PTR VGDTR.Base,ax
        mov   WORD PTR VGDTR.Base+2,dx
        ret
InitGDT     ENDP
;----------------------------------------------------------------------------
InitIDT     PROC
        mov   bx,16
        mov   ax,IDTSeg
        mul   bx
        mov   WORD PTR VIDTR.Base,ax
        mov   WORD PTR VIDTR.Base+2,dx
        ret
InitIDT     ENDP
;----------------------------------------------------------------------------
RCodeSeg    ENDS
        END   Start

⌨️ 快捷键说明

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