您的位置:首页 > Web前端

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

2008-03-17 22:14 148 查看
 

JUMP MACRO selector,offsetv
     DB 0EAH
     DW offsetv
     DW selector
ENDM
    
ECHOCH MACRO ascii
     mov ah,2
     mov dl,ascii
     int 21h
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

.386P
DATA SEGMENT USE16
  GDT LABEL BYTE
  DUMMY     DESCRIPTOR  <>
  CODE_DES  DESCRIPTOR  <0FFFFH,0,0,98H,0>
  CODE_SEL = CODE_DES - GDT
  DATAD_DES  DESCRIPTOR  <0FFFFH,0,0,92H,0>
  DATAD_SEL = DATAD_DES - GDT
  DATAS_DES  DESCRIPTOR  <0FFFFH,0,11H,92H,0>
  DATAS_SEL = DATAS_DES - GDT
  GDTLEN = $-GDT
 
  VGDTR  PDESC  <GDTLEN-1,0>
 
  BUFFERLEN = 256
  BUFFER DB BUFFERLEN DUP(0)
DATA ENDS

CODE SEGMENT USE16
     ASSUME CS:CODE,DS:DATA
START:
      MOV AX,DATA
      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,CS
      MUL BX
      MOV CODE_DES.BASEL,AX
      MOV CODE_DES.BASEM,DL
      MOV CODE_DES.BASEH,DH
     
      MOV AX,DS
      MUL BX
      ADD AX,OFFSET BUFFER
      ADC DX,0
      MOV DATAD_DES.BASEL,AX
      MOV DATAD_DES.BASEM,DL
      MOV DATAD_DES.BASEH,DH
     
      LGDT QWORD PTR VGDTR
     
      CLI
      CALL EA20
     
      MOV EAX,CR0
      OR EAX,1
      MOV CR0,EAX
     
      JUMP <CODE_SEL>,<OFFSET VIRTUAL>
     
VIRTUAL:
      MOV AX,DATAS_SEL
      MOV DS,AX
      MOV AX,DATAD_SEL
      MOV ES,AX
      CLD
      XOR SI,SI
      XOR DI,DI
      MOV CX,BUFFERLEN/4
      REPZ MOVSD
     
      MOV EAX,CR0    
      AND EAX,0FFFFFFFEH
      MOV CR0,EAX
     
      JUMP <SEG REAL>,<OFFSET REAL>
REAL:
      CALL DA20
      STI
     
      MOV AX,DATA
      MOV DS,AX
      MOV SI,OFFSET BUFFER
      CLD
      MOV BP,BUFFERLEN/16
NEXTLINE:
      MOV CX,16
NEXTCH:
      LODSB
      PUSH AX
      SHR AL,4  
      CALL TOASCII
      ECHOCH AL
      POP AX
      CALL TOASCII
      ECHOCH AL
      ECHOCH ' '
      LOOP NEXTCH
      ECHOCH 0DH
      ECHOCH 0AH
      DEC BP
      JNZ NEXTLINE
     
      MOV AH,4CH
      INT 21H
     
TOASCII PROC
     and     al,0fh
     add     al,90h
     daa
     adc     al,40h
     daa
     ret

TOASCII ENDP

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,AX
     POP AX
     RET
DA20 ENDP

CODE ENDS
     END START
                   
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息