杨季文 80x86汇编语言程序设计 实例四

来源:互联网 发布:2017淘宝防排查代码 编辑:程序博客网 时间:2024/05/06 21:33

;用tasm3.0汇编,masm汇编出错
;tlink /32 T10-4.obj

INCLUDE 386SCD.asm
.386P

GDTSEG SEGMENT PARA USE16
    GDT     LABEL   BYTE
    DUMMY   DESCRIPTOR  <>
    NORMAL  DESCRIPTOR  <0FFFFH,0,0,92H,>
    NORMAL_SEL = NORMAL-GDT
    EFFGDT  LABEL   BYTE
    DEMOTSS DESCRIPTOR  <DEMOTSSLEN-1,DEMOTSSSEG,0,89H,>
    DEMOTSS_SEL = DEMOTSS-GDT
    DEMOLDTD DESCRIPTOR <DEMOLDTLEN-1,DEMOLDTSEG,,82H,>
    DEMOLDT_SEL = DEMOLDTD-GDT
    TEMPCODE DESCRIPTOR <0ffffh,TEMPCODESEG,0,98H,>
    TEMPCODE_SEL = TEMPCODE-GDT
    VIDEOBUFFER  DESCRIPTOR  <0FFFFH,0,0,0F00H+92H+DPL3,0>
    VIDEO_SEL = VIDEOBUFFER-GDT
    GDNUM = ($-EFFGDT)/(SIZE DESCRIPTOR)
    GDTLEN = $-GDT   
GDTSEG ENDS

DemoLDTSEG SEGMENT PARA USE16
    DEMOLDT     LABEL   BYTE
    DEMOSTACK0  DESCRIPTOR  <DEMOSTACK0LEN-1,DEMOSTACK0SEG,,92H+4000H,>
    DEMOSTACK0_SEL = (DEMOSTACK0-DEMOLDT)+TIL
    DEMOSTACK1  DESCRIPTOR  <DEMOSTACK1LEN-1,DEMOSTACK1SEG,,92H+4000H+DPL1,>
    DEMOSTACK1_SEL = (DEMOSTACK1-DEMOLDT)+TIL+RPL1
    DEMOSTACK3  DESCRIPTOR  <DEMOSTACK3LEN-1,DEMOSTACK3SEG,,92H+DPL3,>
    DEMOSTACK3_SEL = (DEMOSTACK3-DEMOLDT)+TIL+RPL3
    DEMOCODE    DESCRIPTOR  <DEMOCODELEN-1,DEMOCODESEG,,4098H+DPL3,>
    DEMOCODE_SEL = DEMOCODE-DEMOLDT+TIL+RPL3
    T32CODE     DESCRIPTOR  <T32CODELEN-1,T32CODESEG,,98H+4000H,>
    T32CODE_SEL = T32CODE-DEMOLDT+TIL
    ECHOSUBR    DESCRIPTOR  <ECHOSUBRLEN-1,ECHOSUBRSEG,,409AH+DPL1,>
    ECHO_SEL1 = ECHOSUBR-DEMOLDT+TIL+RPL1
    ECHO_SEL3 = ECHOSUBR-DEMOLDT+TIL+RPL3
    DEMOLDNUM = ($-DEMOLDT)/(SIZE DESCRIPTOR)
    TOT32GATEA  GATE   <T32BEGIN,T32CODE_SEL,0,8CH,0>
    TOT32A_SEL = TOT32GATEA-DEMOLDT+TIL
    TOT32GATEB  GATE   <T32END,T32CODE_SEL,0,8CH+DPL3,0>
    TOT32B_SEL = (TOT32GATEB-DEMOLDT)+TIL
    TOECHOGATE  GATE   <ECHOSUB,ECHO_SEL3,0,8CH+DPL3,0>
    TOECHO_SEL = TOECHOGATE-DEMOLDT+TIL
    DEMOLDTLEN = $-DEMOLDT
DemoLDTSEG ENDS

;----------------------------
DemoTSSSEG SEGMENT PARA USE16
      DD 0
      DW DemoStack0LEN,0
      DW DemoStack0_SEL,0
      DW DemoStack1LEN,0
      DW DemoStack1_SEL,0
      DD ?
      DW ?,0
      DD 0
      DD ?
      DD ?
      DD ?
      DD ?
      DD ?
      DD ?
      DD ?
      DD ?
      DD ?
      DD ?
      DW ?,0
      DW ?,0
      DW ?,0
      DW ?,0
      DW ?,0
      DW ?,0
      DW DemoLDT_SEL,0
      DW 0
      DW $+2
      DB 0FFH
DemoTSSLEN = $
DemoTSSSEG ENDS     
     
;------------------------------
DemoStack0SEG SEGMENT PARA USE32
DemoStack0LEN = 512
      DB DemoStack0LEN DUP(0)
DemoStack0SEG ENDS  

DemoStack1SEG SEGMENT PARA USE32
DemoStack1LEN = 512
      DB DemoStack1LEN DUP(0)
DemoStack1SEG ENDS

DemoStack3SEG SEGMENT PARA USE16
DemoStack3LEN = 512
      DB DemoStack3LEN DUP(0)
DemoStack3SEG ENDS  

;-----------------------------
EchoSUBRSEG SEGMENT PARA USE32
MESSAGE DB 'CPL = ',0
      ASSUME CS:EchoSUBRSEG
EchoSUB PROC FAR
      CLD
      PUSH EBP
      MOV EBP,ESP
      MOV AX,Echo_SEL1
      MOV DS,AX
      MOV AX,Video_SEL
      MOV ES,AX
      MOV EDI,0B8000H
      MOV ESI,OFFSET MESSAGE
      MOV AH,17H
EchoSUB1:
      LODSB
      OR AL,AL
      JZ EchoSUB2
      STOSW
      JMP EchoSUB1
EchoSUB2:
      MOV EAX,[EBP+8]
      AND AL,3
      ADD AL,'0'
      MOV AH,17H
      STOSW
      POP EBP
      RETF
EchoSUB ENDP                 
EchoSUBRLEN = $
EchoSUBRSEG ENDS


;-----------------------------
DemoCodeSEG SEGMENT PARA USE32
      ASSUME CS:DemoCodeSEG
DemoBegin:
      CALL32 ToEcho_SEL,0
      CALL32 ToT32B_SEL,0
DemoCodeLEN = $
DemoCodeSEG ENDS           

;-----------------------------
T32CODESEG SEGMENT PARA USE32
      ASSUME CS:T32CODESEG
T32BEGIN:
      MOV AX,DemoStack0_SEL
      MOV SS,AX
      MOV ESP,DemoStack0LEN
     
      PUSH DWORD PTR DemoStack3_SEL
      PUSH DWORD PTR DemoStack3LEN
     
      PUSH DWORD PTR DemoCode_SEL
      PUSH OFFSET DemoBegin
      RETF
T32End:
      JUMP32 TempCode_SEL,<OFFSET ToReal>
T32CodeLEN = $
T32CODESEG ENDS                 

;-----------------------------
TempCodeSEG SEGMENT PARA USE16
      ASSUME CS:TempCodeSEG
VIRTUAL:
      MOV AX,DemoTSS_SEL
      LTR AX
      MOV BX,DemoLDT_SEL
      LLDT BX
      JUMP16 ToT32A_SEL,0
TOREAL:
      MOV AX,NORMAL_SEL
      MOV DS,AX
      MOV ES,AX
      MOV FS,AX
      MOV GS,AX
      MOV SS,AX
     
      MOV EAX,CR0
      AND AX,0FFFEH
      MOV CR0,EAX
      JUMP16 <SEG REAL>,<OFFSET REAL>
TempCodeLEN = $
TempCodeSEG ENDS                

;---------------------------
RDataSeg SEGMENT PARA USE16
    VGDTR  PDESC  <GDTLEN-1,>
    SPVAR  DW     ?
    SSVAR  DW     ?
RDataSeg ENDS

;---------------------------
RCodeSEG SEGMENT PARA USE16
      ASSUME CS:RCodeSEG,DS:RDataSeg
START:
      MOV AX,RDataSeg
      MOV DS,AX
      CLD
      CALL INIT_GDT
     
      MOV AX,DemoLDTSEG
      MOV FS,AX
      MOV SI,OFFSET DemoLDT
      MOV CX,DemoLDNUM
      CALL INIT_LDT
     
      MOV SSVAR,SS
      MOV SPVAR,SP
      LGDT QWORD PTR VGDTR
      CLI
      MOV EAX,CR0
      OR EAX,1
      MOV CR0,EAX
      JUMP16 TempCode_SEL,<OFFSET Virtual>
REAL:
      MOV AX,RDataSeg
      MOV DS,AX
      LSS SP,DWORD PTR SPVAR
      STI
      MOV AH,4CH
      INT 21H

INIT_GDT PROC NEAR
      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 [SI].BASEL,AX
      MOV [SI].BASEM,DL
      MOV [SI].BASEH,DH
      ADD SI,SIZE DESCRIPTOR
      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
INIT_GDT ENDP

INIT_LDT PROC
ILDT: MOV AX,FS:[SI].BASEL
      MOVZX EAX,AX
      SHL EAX,4
      SHLD EDX,EAX,16
      MOV FS:[SI].BASEL,AX
      MOV FS:[SI].BASEM,DL
      MOV FS:[SI].BASEH,DH
      ADD SI,SIZE DESCRIPTOR
      LOOP ILDT
      RET
      INIT_LDT ENDP
RCodeSEG ENDS
      END START
                               
     
                   

原创粉丝点击