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

这篇博客通过实例展示了80x86汇编语言中如何设计全局描述符表(GDT),并进行代码段和数据段的切换。博主详细解释了GDT的结构,包括LIMIT、BASE和ATTRIBUTES字段,并给出了定义和初始化GDT的代码。此外,还涉及到保护模式到实模式的转换,以及内存缓冲区的使用。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

 

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
                   
 

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值