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

JUMP16 MACRO selector,offsetv
       DB 0EAH
       DW offsetv
       DW selector
       ENDM

JUMP32 MACRO selector,offsetv
       DB 0EAH
       DW offsetv
       DW 0
       DW selector
       ENDM
      
DESCRIPTOR STRUC
   LIMITL      DW  0
   BASEL       DW  0
   BASEM       DB  0
   ATTRIBUTES  DW  0
   BASEH       DB  0
DESCRIPTOR ENDS

PDESC STRUC
   LIMIT  DW  0
   BASE   DD  0
PDESC ENDS

DATALEN = 16

.386P
DSEG SEGMENT USE16
GDT         LABEL   BYTE
DUMMY       DESCRIPTOR  <>
;CODE32      DESCRIPTOR  <0FFFFH,,,0CF98H,>
;CODE32_SEL  = 08H 
;CODE16      DESCRIPTOR  <0FFFFH,,,08F98H,>
;CODE16_SEL  = 10H
;DATAS       DESCRIPTOR  <0FFFFH,,10H,0C092H,>
;DATAS_SEL   = 18H
;DATAD       DESCRIPTOR  <0FFFFH,80A0H,0BH,0CF92H,>
;DATAD_SEL   = 20H
;STACKS      DESCRIPTOR  <0FFFFH,0,0,8F92H,>
;STACKS_SEL  = 28H
;NORMAL      DESCRIPTOR  <0FFFFH,0,0,92H,0>
;NORMAL_SEL  = 30H
;GDTLEN      = $-GDT

CODE32      DESCRIPTOR  <0FFFFH,,,0CF98H,>
CODE32_SEL  = 08H 
CODE16      DESCRIPTOR  <0FFFFH,,,8f98H,>
CODE16_SEL  = 10H
DATAS       DESCRIPTOR  <0FFFFH,,10H,0c092H,>
DATAS_SEL   = 18H
DATAD       DESCRIPTOR  <0FFFFH,80A0H,0BH,0CF92H,>
DATAD_SEL   = 20H
STACKS      DESCRIPTOR  <0FFFFH,0,0,8f92H,>
STACKS_SEL  = 28H
NORMAL      DESCRIPTOR  <0FFFFH,0,0,92H,0>
NORMAL_SEL  = 30H
GDTLEN      = $-GDT

VGDTR       PDESC   <GDTLEN-1,>
VARSS       DW      ?
DSEG        ENDS

CSEG1  SEGMENT  USE16  'REAL'
ASSUME CS:CSEG1,DS:DSEG
START:
      MOV AX,DSEG
      MOV DS,AX
     
      MOV BX,16
      MUL BX
      ADD AX,OFFSET GDT
      ADC DX,0
      MOV WORD PTR VGDTR.BASE,AX
      MOV WORD PTR VGDTR.BASE+2,DX
     
      MOV AX,CSEG2
      MUL BX
      MOV CODE32.BASEL,AX
      MOV CODE32.BASEM,DL
      MOV CODE32.BASEH,DH
     
      MOV AX,CSEG3
      MUL BX
      MOV CODE16.BASEL,AX
      MOV CODE16.BASEM,DL
      MOV CODE16.BASEH,DH
     
      MOV AX,SS
      MUL BX
      MOV STACKS.BASEL,AX
      MOV STACKS.BASEM,DL
      MOV STACKS.BASEH,DH
      MOV VARSS,SS
     
      LGDT QWORD PTR VGDTR
      CLI
      CALL EA20
     
      MOV EAX,CR0
      OR EAX,1
      MOV CR0,EAX
     
      JUMP16 CODE32_SEL,<OFFSET SPM32>
     
TOREAL:
      MOV AX,DSEG
      MOV DS,AX
      MOV SS,VARSS
      CALL DA20
      STI
      MOV AH,4CH
      INT 21H
     
EA20 PROC
     PUSH AX
     IN AL,92H
     OR AL,2
     OUT 92H,AL
     POP AX
     RET
EA20 ENDP

DA20 PROC
     PUSH AX
     IN AL,92H
     AND AL,0FDH
     OUT 92H,AL
     POP AX
     RET
DA20 ENDP

CSEG1 ENDS

CSEG2 SEGMENT USE32 'PM32'
ASSUME CS:CSEG2
SPM32:
      MOV AX,STACKS_SEL
      MOV SS,AX
      MOV AX,DATAS_SEL
      MOV DS,AX
      MOV AX,DATAD_SEL
      MOV ES,AX
     
      XOR ESI,ESI
      XOR EDI,EDI
      MOV ECX,DATALEN           
      CLD
NEXT:
      LODSB
      PUSH AX
      CALL TOASCII
      MOV AH,7
      SHL EAX,16
      POP AX
      SHR AL,4
      CALL TOASCII
      MOV AX,7
      STOSD
      MOV AL,' '
      STOSW
      LOOP NEXT
      JUMP32 CODE16_SEL,<OFFSET SPM16>

TOASCII PROC
      AND AL,0FH
      ADD AL,90H
      DAA
      ADC AL,40H
      DAA
      RET
TOASCII ENDP

CODE32LEN = $
CSEG2 ENDS

CSEG3 SEGMENT USE16 'PM16'
ASSUME CS:CSEG3
SPM16:
      XOR SI,SI
      MOV DI, DATALEN*6
      MOV AH,7
      MOV CX,DATALEN
AGAIN:
      LODSB
      STOSW
      LOOP AGAIN
     
      MOV AX,NORMAL_SEL
      MOV DS,AX
      MOV ES,AX
     
      MOV EAX,CR0
      AND EAX,0FFFFFFFEH
      MOV CR0,EAX
      JUMP16 <SEG TOREAL>,<OFFSET TOREAL>
CSEG3 ENDS
      END START                       
       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值